Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Petit problème de curseurs non fermés dans une applie Java sur Oracle par JDBC

16 réponses
Avatar
Trognon Patrice
Bonjour,

J'ai une application Java sur une base Oracle 10g sous linux.
La connection sur la base est assurée par le driver JDBC
d'Oracle de type 4, à savoir j'utilise les jar fournis par
Oracle dans la distribution 10g :
orai18n.jar
ojdbc14.jar

<-----------------Question 1----------------->
Dans mon code j'ai bien vérifié je ferme bien mes curseurs
en appelant la méthode close() du la classe Statement, dans
le doute j'ai aussi invoqué la méthode close() de la
classe ResultSet. Mon application ne fonctionne qu'en select
je n'ai aucunne requete d'INSERT, UPDATE ou DELETE.

Sur un gros traitement je fini par tomber sur un erreur Oracle
m'indiquant que le nombre maximum de curseurs est dépassé :
ORA-01000: nombre maximum de curseurs ouverts dépassé

Comme je ferme bien mes Statement (et meme les ResultSet), je
ne comprends pas d'ou cela vient.

Est ce un bug dans le driver JDBC d'Oracle ?
Est ce un bug au niveau d'Oracle ?

Je ne pense pas que ce soit le cas, tout de même
cela me semble gros !!!

Sinon d'ou cela peut il venir ?

Voila, si quelqu'un est déjà tombé sur le problème et l'a
résolu je suis interessé par tout information.
<-----------------/Question 1----------------->

<-----------------Question 2----------------->
Au passage, seconde question, je voudrais bien loguer dans un
fichier debug.log les requêtes, je travaille uniquement
en PreparedStatement qui sont ensuite bindés par Statement.setX(...).
Comment recupérer le texte de la requete une fois le bind-in
effectué afin de la loguer en clair, pour l'instant je retrouve
dans mon fichier de log les querys avec les ? des paramètres.
<-----------------/Question 1----------------->



--
Cordialement,

Patrice Trognon
http://www.javadevel.com

6 réponses

1 2
Avatar
Lionel
Lionel wrote:
Pour les ? dans les logs, pas d'autre solution que d'afficher à la
main les paramètres passés à oracle.


J'ai découvert ceci qui devrait pouvoir t'aider:
http://www.p6spy.com

Avatar
Lionel
Trognon Patrice wrote:
while (rset.next()) {
PreparedStatement stmtDEUX = conn.prepareStatement(query2) ;
ResultSet rsetDEUX = stmtDEUX.executeQuery();
while ( rsetDEUX.next() ) {
}
rsetDEUX.close();
stmtDEUX.close();
}
rset.close();
stmt.close();
!

En sortant le PreparedStatement de la boucle et donc en l'utilisant comme il
devrait l'etre, ca résoudrait pas ton pb ?

Avatar
Trognon Patrice
Trognon Patrice wrote:

Bonjour,


Comme je ferme bien mes Statement (et meme les ResultSet), je
ne comprends pas d'ou cela vient.

Est ce un bug dans le driver JDBC d'Oracle ?
Est ce un bug au niveau d'Oracle ?

Je ne pense pas que ce soit le cas, tout de même
cela me semble gros !!!



Bonjour,

J'ai tout vérifié, c'est correct je ferme bien tout :(

Bon, j'implemente un workaround, je vais encapsulé l'appel
a Connection.prepareStatement() pour compter le nombre
de curseur, et quand j'arrive au MAX_CURSOR je ferme
et re-ouvre la connection.

c'est crade, mais ca marche :(

Me reste à trouver comment recupérer le nombre max de curseurs
par un query SQL au debut de mon code, mais ca je vais trouver
google est mon ami ;)

Merci à tous pour vos réponse.oui

--
Cordialement,

Patrice Trognon
http://wwW.javadevel.com

Avatar
jerome moliere
Trognon Patrice wrote:

Trognon Patrice wrote:


Bonjour,


Comme je ferme bien mes Statement (et meme les ResultSet), je
ne comprends pas d'ou cela vient.

Est ce un bug dans le driver JDBC d'Oracle ?
Est ce un bug au niveau d'Oracle ?

Je ne pense pas que ce soit le cas, tout de même
cela me semble gros !!!




Bonjour,

J'ai tout vérifié, c'est correct je ferme bien tout :(

Bon, j'implemente un workaround, je vais encapsulé l'appel
a Connection.prepareStatement() pour compter le nombre
de curseur, et quand j'arrive au MAX_CURSOR je ferme
et re-ouvre la connection.

c'est crade, mais ca marche :(

Me reste à trouver comment recupérer le nombre max de curseurs
par un query SQL au debut de mon code, mais ca je vais trouver
google est mon ami ;)

Merci à tous pour vos réponse.oui

a ta place je changerai de driver c'est moins crade plus rapide et pas

tres cher,quand on a les moyens d'avoir du oracle en prod alors on peut
s'acheter un driver moins crade....
pour ta question sur les preparedstatement jettes un oeil aux proxies
JDBC dont le plus sympa est irongrid sql..

HTH
Jerome

--
Auteur cahier du programmeur Java tome 2 - Eyrolles 10/2003
http://www.eyrolles.com/php.informatique/Ouvrages/ouvrage.php3?ouv_ean13—82212111941


Avatar
Trognon Patrice
jerome moliere wrote:

a ta place je changerai de driver c'est moins crade plus rapide et pas
tres cher,quand on a les moyens d'avoir du oracle en prod alors on peut
s'acheter un driver moins crade....


Tu me conseilles lequel ?


--
Cordialement,

Patrice Trognon
http://wwW.javadevel.com

Avatar
jerome moliere
Trognon Patrice wrote:

jerome moliere wrote:


a ta place je changerai de driver c'est moins crade plus rapide et pas
tres cher,quand on a les moyens d'avoir du oracle en prod alors on peut
s'acheter un driver moins crade....



Tu me conseilles lequel ?


datdirect marche tres bien...

jamais eu de soucis, plus leger (qq dizaines de ko)
par contre pas teste avec du 10G en RAC!!!
mais vu les focntionnalites niveau clustering du driver thind 'oracle
cela ne peut etre pire :)

--
Auteur cahier du programmeur Java tome 2 - Eyrolles 10/2003
http://www.eyrolles.com/php.informatique/Ouvrages/ouvrage.php3?ouv_ean13—82212111941


1 2