2010-01-04 6 views
2

Je fais face à ORA-01000: maximum de curseurs ouverts dépassés bien que je ferme les résultats en bloc final. Mais je soupçonne qu'il ya des problèmes avec mon code héritage, ci-dessous est mon pseudo-codeJava: stratégie de fermeture ResultSet, mise à part la fermeture

while (someCondition) { 
rs1=executePreparedStatementNew(query1,param1,""); 
//do something with rs1 
rs1=executePreparedStatementNew(query2,param2,""); 
} 
  1. Si les boucles fonctionne 5 fois, combien de curseur sera ouvert par ce code?
  2. Si je ferme finalement rs1, combien de curseurs seront fermés, certains disent que l'instance de rs1 pour query1 ne sera pas fermée car elle est masquée par l'instance query2.
  3. Est-ce que les résultats sont masqués de cette façon? Dans ce cas, comment s'assurer que toutes les instances sont fermées.

Appréciez toute aide.

Répondre

6

Vous n'avez pas indiqué où se trouve votre bloc finally, mais s'il se trouve en dehors de la boucle while, alors oui aura des ensembles de résultats non fermés. La variable rs1 fera référence au "dernier" jeu de résultats récupéré - c'est donc le seul qui sera fermé. Il n'y a rien de magique ici - c'est juste le comportement normal des variables. Je suggérerais que vous sépariez chaque cas de "récupérer le résultat et l'utiliser" dans sa propre méthode, et que vous fermiez le jeu de résultats dans un bloc try/finally dans cette méthode. Cela permettra de bien comprendre ce qui se passe.

+1

+1 pour "rien de magique ici". :-) –

+0

Oui, mon bloc finally est en dehors de la boucle while. Je vais changer mon code pour utiliser le resultset séparé, mais juste par curiosité est-il de toute façon de fermer tous les résultats dans le code ci-dessus? Est-ce que ça va aider si je ferme rs1 avant de l'utiliser pour query2? –

+1

@Ravi - oui un 'rs1.close()' explicite après avoir fini avec le premier ResultSet ferait l'affaire. (L'appel de 'close()' sur un ResultSet fermé est défini comme un no-op, donc vous n'avez pas à vous soucier des doubles fermetures dans le bloc 'finally' externe.) –