Je reçois une exception SQL ORA-01000. J'ai donc quelques requêtes en rapport avec cela.
-
Les curseurs ouverts maximum sont-ils directement liés au nombre de connexions JDBC, ou sont-ils aussi liés aux objets de déclaration et de résultat que nous avons créés pour une seule connexion ? (Nous utilisons un pool de connexions)
-
Existe-t-il un moyen de configurer le nombre d'objets de déclaration/résultat dans la base de données (comme les connexions) ?
-
Est-il conseillé d'utiliser des objets de déclaration/résultat variables d'instance au lieu d'objets de déclaration/résultat locaux à la méthode dans un environnement à un seul thread ?
-
Est-ce que l'exécution d'une instruction préparée dans une boucle cause ce problème ? (Bien sûr, j'aurais pu utiliser sqlBatch) Note : pStmt est fermé une fois la boucle terminée.
{ //début du try de la méthode String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)"; pStmt = obj.getConnection().prepareStatement(sql); pStmt.setLong(1, subscriberID); for (String language : additionalLangs) { pStmt.setInt(2, Integer.parseInt(language)); pStmt.execute(); } } //fin de la méthode/du try { //début du finally pStmt.close() } //fin du finally
-
Que se passera-t-il si conn.createStatement() et conn.prepareStatement(sql) sont appelés plusieurs fois sur un seul objet connection ?
Édition 1: 6. Est-ce que l'utilisation d'un objet de déclaration à référence faible/forte aidera à prévenir les fuites de mémoire ?
Édition 2: 1. Y a-t-il un moyen de trouver tous les "statement.close()" manquants dans mon projet ? Je comprends que ce n'est pas une fuite de mémoire. Mais j'ai besoin de trouver une référence à une déclaration (où close() n'a pas été effectué) éligible à la collecte d'ordures ? Un outil disponible ? Ou dois-je l'analyser manuellement ?
Veuillez m'aider à comprendre cela.
Solution
Pour trouver le curseur ouvert dans la base de données Oracle pour le nom d'utilisateur - VELU
Allez sur la machine ORACLE et lancez sqlplus en tant que sysdba.
[oracle@db01 ~]$ sqlplus / as sysdba
Ensuite, exécutez
SELECT A.VALUE,
S.USERNAME,
S.SID,
S.SERIAL#
FROM V$SESSTAT A,
V$STATNAME B,
V$SESSION S
WHERE A.STATISTIC# = B.STATISTIC#
AND S.SID = A.SID
AND B.NAME = 'opened cursors current'
AND USERNAME = 'VELU';
Si possible, veuillez lire ma réponse pour mieux comprendre ma solution
0 votes
Pouvez-vous poster votre code complet ? Ce serait intéressant de voir où vous fermez les accolades ouvertes pour
for (String language : additionalLangs) {
0 votes
@ Kanagavelu Sugumar : pourquoi ne pas poser 5 questions différentes sur SO ?
1 votes
Voici une réponse que j'ai trouvée très utile : stackoverflow.com/a/4507507/501113
0 votes
Veuillez voir si la réponse est utile : stackoverflow.com/questions/34716456/…
0 votes
Pour suivre les curseurs ouverts dans Oracle, vous voudrez peut-être également jeter un œil à la vue
SYS.V$OPEN_CURSOR
. Cela vous donnera non seulement le SID, mais aussi le texte SQL.