Hibernate - após gravar milhares de registros > Session is closed!

2 respostas
cleiton_herrmann

Olá pessoal, td blz?

Eu to fazendo importação de uma listagem de números de telefone, pro meu sistema, eles estão originalmente em arquivos do excel, que entao sao salvos no formato csv(formato com os campos separados por ‘;’), existem arquivos desde 6 mil e poucos números até arquivos com 215 mil e cassetada de números, entao em uma Thread, meu sistema possui um laço de repetição que le cada linha, separando os campos por ‘;’ e criando uma lista de array de strings, este é o primeiro passo, logo após isso, outro laço de repetição onde são criados os objetos que serão gravados, e depois que a lista de objetos está pronta, outro laço onde o sistema vai varrendo a lista e verificando se ele ja existe na base de dados, se sim, altera o valor dos campos com os novos valores, se nao, eles são gravados, este é o processo…

O problema é que as vezes, e aleatoreamente, ele esta dando erro de (session is closed), as vezes eu importo 7 mil registros e da erro, as vezes é importado 60 mil registros e dai quando tah quase terminando o arquivo da erro, o erro sai na telinha de output do netbeans, misturado no código sql que o hibernate gera. como é mostrado abaixo, coloquei as linhas de erro em vermelho e azul pra facilitar:

no hibernate.cfg.xml, eu defini pra que o hibernate controle o “flush” e o “close” da session, com os parametros abaixo:

<property name="hibernate.transaction.flush_before_completion">true</property> <property name="hibernate.transaction.auto_close_session">true</property>
eu tenho uma classe HibernateUtil, que possui um método que fornece um objeto session pra classe dao, e ele esta setando na sessao o flushmode que diz que quando for realizado um commit na transaction deve ser feito o flush da session…

na minha classe dao, o método inserir é o seguinte, o alterar na verdade é igual, só faz um saveOrUpdate invés de save:

public static boolean inserir(Object objeto) { Session sessao = HibernateUtil.getSessao(); Transaction trx = sessao.beginTransaction(); try { sessao.save(objeto); trx.commit(); excessao = null; return true; } catch (HibernateException ex) { ex.printStackTrace(); trx.rollback(); excessao = ex; return false; } }

não faço idéia do porque este erro está acontecendo, não sei neim o q imaginar, a unica classe que acessa o banco é o dao, e nao existe nela nenhum método, nenhuma consulta que esteja fechando a session, e tbem ja revirei meu sistema e não achei em nenhuma outra classe um código que feche a sessao, somente quem esta fechando a sessao é o próprio hibernate, se alguem tiver uma ideia do que possa ser…

Desde já obrigado !!

2 Respostas

R

Já tentou criar uma única sessão e passá-la por parâmetro nessa rotina de “inserir”?

cleiton_herrmann

bem, na verdade eu acabei de achar numa parte mais antiga do código aqui na tela inicial do sistema, uma thread que faz uma consulta de 5 em 5 minutos, e ela fechava a session, um código mais antigo que tinha feito e fechava a session manualmente, nem lembrava mais dele, mas provavelmente era isso que estava causando a exception, ele tentava gravar ou consultar bem na hora em que ele fechava a session e nao conseguia abrir denovo a tempo, e como 7000 registros demoram ± 5 minutos pra serem importados, é justamente o tempo da thread, e as vezes ele conseguia fechar e abrir a session sem causar a exception, entao chegava aos 60 mil e poucos registros importados…
enfim arrumei a thread pra nao fechar mais a session e estou testando denovo, e ja importei 68 mil registros, até agora nao deu erro, provavelmente resolvido o problema…

Obrigado, qq coisa volto a postar aqui, vlw t+

Criado 10 de agosto de 2008
Ultima resposta 10 de ago. de 2008
Respostas 2
Participantes 2