java - programmatically - iphone carregando lento




O que é o carregamento lento no Hibernate? (10)

Carregamento preguiçoso é um padrão de projeto comumente usado na programação de computadores para adiar a inicialização de um objeto até o ponto em que é necessário. Isso pode contribuir para a eficiência na operação do programa, se usado de maneira adequada e apropriada

Wikipedia

Link de carregamento lento de hibernate.org

O que é carregamento lento em Java? Eu não entendo o processo. Alguém pode me ajudar a entender o processo de carregamento lento?


"Carregamento lento" significa que uma entidade só será carregada quando você acessar a entidade pela primeira vez.

O pattern é assim:

public Entity getEntity() {
    if (entity == null) {
        entity = loadEntity();
    }
    return entity;
}

Isso economiza o custo de pré-carregar / pré-preencher todas as entidades em um grande conjunto de dados de antemão enquanto você, afinal, não precisa de todos eles.

No Hibernate, você pode configurar para carregar lentamente uma coleção de entidades filhas. O carregamento lento real é então feito dentro dos métodos do PersistentSet que o Hibernate usa "sob os capôs" para designar a coleção de entidades como Set .

Por exemplo

public class Parent {
    private Set<Child> children;

    public Set<Child> getChildren() {
        return children;
    }
}

.

public void doSomething() {
    Set<Child> children = parent.getChildren(); // Still contains nothing.

    // Whenever you call one of the following (indirectly), 
    // Hibernate will start to actually load and fill the set.
    children.size();
    children.iterator();
}

A configuração preguiçosa decide se é necessário carregar objetos filhos durante o carregamento do Objeto Parente.É necessário fazer essa configuração com o respectivo arquivo de mapeamento de hibernação da classe pai.Lazy = true (significa não carregar filho) Por padrão, o carregamento lento dos objetos filhos é verdadeiro . Isso garante que os objetos filhos não sejam carregados, a menos que sejam explicitamente invocados no aplicativo chamando o método getChild () no pai. Nesse caso, o hibernate emite uma chamada de banco de dados nova para carregar o filho quando getChild () é chamado no pai. object.Mas em alguns casos, você precisa carregar os objetos filho quando pai é carregado. Apenas faça o preguiçoso = falso e o hibernar carregará o filho quando o pai for carregado a partir do banco de dados.Exampleslazy = true (padrão) O filho do endereço da classe User pode ficar com preguiça se não for requerido com frequência.lazy = falseMas você pode precisar carregar o objeto de autor para o livro pai sempre que você lida com o livro de livraria on-line.


A configuração preguiçosa decide se é necessário carregar objetos filhos durante o carregamento do Objeto Parente.É necessário fazer essa configuração com o respectivo arquivo de mapeamento de hibernação da classe pai.Lazy = true (significa não carregar filho) Por padrão, o carregamento lento dos objetos filhos é verdadeiro .


Bydefault preguiçoso carregamento é true.Lazy loading significa quando a consulta de seleção é executada, ele não irá atingir o banco de dados. Ele irá esperar pela função getter, ou seja, quando for necessário, ele buscará a partir da base de dados. Por exemplo: você é um pai que tem um filho com muitos brinquedos. Mas a questão atual é sempre que você liga para ele (nós achamos que você tem um menino), ele vem até você com todos os brinquedos dele também. Agora isso é um problema, já que você não quer que ele carregue seus brinquedos o tempo todo. Então, sendo o pai da lógica, você vai em frente e define os brinquedos da criança como LAZY. Agora, sempre que você ligar para ele, ele só vem até você sem os brinquedos dele.


Carregamento lento? Bem, significa simplesmente que os registros filhos não são buscados imediatamente, mas automaticamente assim que você tentar acessá-los.


Em linguagem de leigos, é como se você estivesse fazendo um bolo e você precisará de 5-10 ingredientes da geladeira. Você tem duas opções, pegar todos os ingredientes da geladeira e colocá-los na sua plataforma de cozinha, ou trazer o item que quiser quando precisar.

Da mesma forma, no carregamento rápido, você obtém todas as informações sobre o bean e suas classes relacionadas (não é filho ou é uma relação, mas tem um relacionamento, ou seja, bolo tem farinha, leite, creme etc.) e, em caso de carregamento lento, primeiro você traz apenas seu identificador e valores que vêm da mesma mesa (ingredientes necessários que primeiro você precisará em sua tigela em caso de bolo). Todas as informações provenientes de outras tabelas serão obtidas como e quando requeridas / usadas.


Martin Fowler define o padrão Lazy Load em Patterns of Enterprise Application Architecture como tal:

Um objeto que não contém todos os dados de que você precisa, mas sabe como obtê-lo.

Portanto, ao carregar um determinado objeto, a ideia é não carregar rapidamente o (s) objeto (s) relacionado (s) que você não pode usar imediatamente para salvar o custo de desempenho relacionado. Em vez disso, o (s) objeto (s) relacionado (s) será (ão) carregado (s) somente quando usado (s).

Este não é um padrão específico para acesso a dados e Hibernate, mas é particularmente útil em tais campos e o Hibernate suporta carregamento lento de associações um-para-muitos e associações de ponto único (um-para-um e muitos-para-um) também sob certas condições. A interação preguiçosa é discutida em mais detalhes no Capítulo 19 da Documentação de Referência do Hibernate 3.0.


O carregamento preguiçoso permite adiar a recuperação da associação ou ter um melhor controle sobre a estratégia de busca.

Ao usar o carregamento do EAGER, você define um plano de carregamento global que não pode ser substituído no momento da consulta, o que significa que você está limitado a uma decisão tomada ao projetar seu modelo de entidade. A busca EAGER é um cheiro de código , porque a estratégia de busca é uma política de tempo de consulta e pode diferir de um caso de uso de negócios para outro.

A estratégia de busca é um aspecto muito importante, pois a busca excessiva do EAGER pode causar sérios problemas relacionados ao desempenho.


Surpreendentemente, nenhuma das respostas fala sobre como isso é alcançado pela hibernação por trás das telas.

Carregamento preguiçoso é um padrão de design que é efetivamente usado em hibernação por motivos de desempenho que envolve seguir técnicas.

1. Instrumentação de código de byte :

Melhora a definição da classe base com hooks hibernação para interceptar todas as chamadas para esse objeto de entidade.

Feito em tempo de compilação ou executando [load] time

1.1 tempo de compilação

  • Pós operação de tempo de compilação

  • Principalmente por plugins maven / formiga

1.2 tempo de execução

  • Se nenhuma instrumentação em tempo de compilação é feita, isso é criado em tempo de execução Usando bibliotecas como o javassist

2. Proxies

O objeto de entidade que o Hibernate retorna é um proxy do tipo real.

Veja também: Javassist. Qual é a idéia principal e onde o uso real?







lazy-loading