127 votes

Java.sql.SQLException: - ORA-01000: nombre maximum de curseurs ouverts dépassé

Je reçois une exception SQL ORA-01000. J'ai donc quelques requêtes en rapport avec cela.

  1. 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)

  2. 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) ?

  3. 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 ?

  4. 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 
  5. 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

0voto

gilbertoag Points 21

J'ai eu ce problème avec ma source de données dans WildFly et Tomcat, en se connectant à un Oracle 10g.

J'ai constaté que dans certaines conditions, la déclaration n'était pas fermée même lorsque la méthode statement.close() était invoquée. Le problème était avec le pilote Oracle que nous utilisions : ojdbc7.jar. Ce pilote est destiné à Oracle 12c et 11g, et il semble avoir des problèmes lorsqu'il est utilisé avec Oracle 10g, donc je suis revenu à ojdbc5.jar et maintenant tout fonctionne bien.

0voto

RArora Points 309

J'ai rencontré le même problème parce que je interrogeais la base de données pour plus de 1000 itérations. J'ai utilisé try et finally dans mon code. Mais j'obtenais toujours une erreur.

Pour résoudre cela, je me suis simplement connecté à la base de données Oracle et j'ai exécuté la requête suivante :

ALTER SYSTEM SET open_cursors = 8000 SCOPE=BOTH;

Et cela a résolu mon problème immédiatement.

0voto

winSharp93 Points 7124

Je suis tombé sur ce problème après avoir défini la taille du cache de l'instruction préparée sur une grande valeur. Apparemment, lorsque les instructions préparées sont conservées en cache, le curseur reste ouvert.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X