Bonjour,
J'ai un problème qui est déjà revenu plusieurs fois sur ce forum : j'ai un programme qui rencontre l'erreur ORA-01000: nombre maximum de curseurs ouverts dépassé. Je sais que quand on ouvre un preparedStatement, il faut ensuite le fermer avec sa méthode close(). Et je pense que c'est fait dans l'appli...
L'application en question permet de lire des fichiers, de les découper en enregistrement, et de mettre chaque enregistrement dans une table. On vient de développer un nouveau type de fichier pour lequel, en fonction de la valeur d'un champ, un enregistrement sera insérer à l'aide de la requête A ou de la requête R. A chaque enregistrement, j'ai donc un test tel que :
Avec les déclarations suivantes (ailleurs dans la classe, ou dans les classes mères):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if(type = 'A') { m_stmt_insert = m_cnx.prepareStatement( m_requeteACH ); } else //type='R' { m_stmt_insert = m_cnx.prepareStatement( m_requeteRTD ); }
A la fin de chaque enregistrement, j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 protected Connection m_cnx; protected PreparedStatement m_stmt_insert = null; private String m_requeteRTD; private String m_requeteACH;
Tant que la volumétrie en entrée est faible, OK ; dés qu'elle est trop grosse, boum ! Mon nombre de curseurs autorisés par session est de 300, et au bout de 293 enregistrement, ça claque...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if ( m_stmt_insert != null ) { m_stmt_insert.close(); }
Est-ce que le problème vient des bouts de code mis ici ou est-ce que ça viendrait d'ailleurs ? J'ai lu sur ce forum que des gens avaient aussi eu des soucis avec un close() sans effet, comme si l'objet Oracle n'était pas vraiment fermé.
Je soupçonne fortement le fait de recréer le preparedStatement à chaque enregistrement (avec m_stmt_insert = m_cnx.prepareStatement( m_requeteRTD ); par exemple). En effet, nous avons d'autres classes, traitant des fichiers similaires, mais la commande m_stmt_insert = m_cnx.prepareStatement( m_requeteAutre ); n'est fait qu'une seule fois (il y a un seul type d'enregistrement, donc on fait ça dans l'initialisation et non à chaque fois)...
Je suis preneur de toute idée, piste, hypothèse et conseil ! Merci d'avance.![]()
Partager