Este artigo analisa detalhadamente o uso do Hibernate para gerenciar operações de sessão e lote. Compartilhe com todos para sua referência. A análise específica é a seguinte:
Hibernate gerencia sessão
O próprio Hibernate fornece três métodos de gerenciamento de objetos Session ① O ciclo de vida do objeto Session está vinculado ao thread local ② O ciclo de vida do objeto Session está vinculado à transação JTA ③ O programa delegado do Hibernate gerencia o ciclo de vida do objeto Session
No arquivo de configuração do Hibernate, o atributo hibernate.current_session_context_class é usado para especificar o método de gerenciamento de sessão. Os valores opcionais incluem:
① thread: O ciclo de vida do objeto Session está vinculado ao thread local ② jta*: O ciclo de vida do objeto Session está vinculado à transação JTA ③ gerenciado: programa delegado do Hibernate para gerenciar o ciclo de vida do objeto Session
O ciclo de vida do objeto Session está vinculado ao thread local:
Se o valor do atributo hibernate.current_session_context_class do arquivo de configuração do Hibernate estiver definido como thread, o Hibernate gerenciará a sessão de uma maneira vinculada ao thread local.
O Hibernate vincula a sessão ao thread local de acordo com as seguintes regras:
Quando um thread (thread) chama o método getCurrentSession() do objeto SessionFactory pela primeira vez, este método criará um novo objeto Session (sessionA), vinculará o objeto ao threadA e retornará a sessão quando threadA chamar o objeto SessionFactory novamente . Ao usar o método getCurrentSession(), este método retornará o objeto sessionA. Quando threadA envia a transação associada ao objeto sessionA, o Hibernate irá liberar automaticamente. Armazene em cache o objeto sessionA, confirme a transação e feche a sessão conforme desejado. Quando threadA cancela a transação associada ao objeto sessionA, o objeto sessionA também será fechado automaticamente. Se threadA chamar o método getCurrentSession() do objeto SessionFactory novamente, este método criará um novo objeto Session (sessionB) e vinculará o objeto a. threadA e retornar sessionB
Processar dados em lotes
O processamento em lote de dados refere-se ao processamento de uma grande quantidade de dados em uma transação e operações em lote no processo da camada de aplicativo. Os principais métodos são os seguintes:
① Através da Sessão
② Passe HQL
③ Através de StatelessSession
④ Através da API JDBC ---- Recomendado porque é o mais rápido
A sessão executa operações em lote:
Os métodos save() e update() da sessão armazenarão os objetos processados em seu próprio cache. Se um objeto Session for usado para processar um grande número de objetos persistentes, os objetos que foram processados e não serão acessados novamente deverão ser esvaziados do cache em tempo hábil. O método específico é chamar imediatamente o método flush() para atualizar o cache após processar um objeto ou um pequeno lote de objetos e, em seguida, chamar o método clear() para armazenar o cache em cache.
As operações de processamento através de Session estão sujeitas às seguintes restrições:
O número de processamento em lote único JDBC precisa ser definido no arquivo de configuração do Hibernate. Deve-se garantir que o número de lotes de instruções SQL enviados ao banco de dados a cada vez seja consistente com o atributo de tamanho do lote.
Se o objeto usar o gerador de identificador de "identidade", o Hibernate não poderá executar operações de inserção em lote no JDBC.
Ao realizar operações em lote, é recomendado desligar o cache de segundo nível do Hibernate
Demonstração de código para inserção de dados em lote:
Copie o código e o código é o seguinte: News news = null;
for(int i = 0; i < 10000; i++) {
notícias = novas notícias();
news.setTitle("--" + i);
sessão.save(notícias);
se((eu + 1)% 20 == 0) {
sessão.flush();
sessão.claro();
}
}
Atualização em lote: Ao realizar a atualização em lote, obviamente não é aconselhável carregar todos os objetos no cache da sessão de uma vez e depois atualizá-los um por um no cache.
Use o conjunto de resultados rolável org.hibernate.ScrollableResults Este objeto não contém nenhum objeto, apenas o cursor usado para localizar registros online. Somente quando o programa percorrer para acessar um elemento específico do objeto ScrollableResults, ele carregará o objeto correspondente no banco de dados.
O objeto org.hibernate.ScrollableResults é retornado pelo método scroll da consulta
Operações em lote via HQL:
Nota: HQL suporta apenas instruções de inserção na forma de INSERT INTO...SELECT, mas não suporta instruções de inserção na forma de INSERT INTO...VALUES. Portanto, as operações de inserção em lote não podem ser realizadas usando HQL
Operações em lote por meio de StatelessSession:
Formalmente, o uso de StatelessSession é semelhante ao Session. Comparado com Session, StatelessSession tem as seguintes diferenças:
StatelessSession não tem cache e os objetos carregados, salvos ou atualizados por meio de StatelessSession estão em estado livre.
StatelessSession não interage com o cache de segundo nível do Hibernate Ao chamar os métodos save(), update() ou delete() do StatelessSession, esses métodos executarão imediatamente a instrução SQL correspondente em vez de planejar apenas a execução de uma instrução SQL.
StatelessSession não executa verificação suja, portanto, após modificar as propriedades do objeto Cliente, você precisa chamar o método update() de StatelessSession para atualizar os dados no banco de dados.
StatelessSession não realizará nenhuma operação em cascata nos objetos associados. O objeto Customer com OID 1 é carregado duas vezes através do mesmo objeto StatelessSession. Os endereços de memória dos dois objetos obtidos são diferentes.
As operações realizadas pelo StatelessSession podem ser capturadas pelo interceptor Interceptor, mas serão ignoradas pelo sistema de processamento de eventos do Hibernate.
Espero que este artigo seja útil para a programação Java de todos.