java.sql.SQLException: - ORA-01000: un maximum de curseurs ouverts dépassé

Je reçois un ORA-01000 exception SQL. J'ai donc quelques questions concernant il.

  1. Maximum de curseurs ouverts exactement du nombre de connexions JDBC, ou sont-ils liés à la déclaration et objets resultset nous avons créé pour une seule connexion ? (Nous sommes à l'aide de pool de connexions)
  2. Est-il un moyen de configurer le nombre de déclaration/objets resultset dans la base de données (comme des connexions) ?
  3. Est-il conseillé d'utiliser la variable d'instance ou déclaration d'un objet resultset au lieu de la méthode locale ou déclaration d'un objet resultset dans un seul thread de l'environnement ?
  4. Fait de l'exécution d'une instruction préparée dans une boucle à l'origine de ce problème ? (Bien sûr, j'aurais pu utiliser sqlBatch) Remarque: pStmt est fermé une fois que la boucle est terminée.

    { //method try starts  
      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();
      }
    } //method/try ends
    
    { //finally starts
       pStmt.close()
    } //finally ends 
  5. Ce qui va se passer si conn.createStatement() et conn.prepareStatement(sql) sont appelés plusieurs fois sur l'objet de connexion ?

Edit1:
6. L'utilisation de la Faiblesse de l'/Soft de référence de la déclaration de l'objet de l'aide dans la prévention de la fuite ?

Edit2:
1. Est-il de toute façon, je peux trouver tous les disparus "de la déclaration.close()"dans mon projet ? Je comprends ce n'est pas une fuite de mémoire. Mais j'ai besoin de trouver un énoncé de référence (d'où close() n'est pas exécutée) admissibles pour la collecte des ordures ? Un outil disponible ? Ou dois-je analyser manuellement ?

Merci de m'aider à le comprendre.

Solution

Pour trouver le curseur ouvert dans Oracle DB pour le nom d'utilisateur -VELU

Aller à ORALCE machine et de commencer à sqlplus en tant que sysdba.

[oracle@db01 ~]$ sqlplus / as sysdba 

Puis 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 merci de lire ma réponse à la fin.

  • Vous pouvez poster votre code complet? Il serait intéressant de voir où en êtes-vous fermeture de l'ouverture des accolades ouvert pour for (String language : additionalLangs) {
  • Kanagavelu Sugumar : pourquoi ne pas poser 5 questions différentes dans?
  • Voici une réponse que j'ai trouvé très utile: stackoverflow.com/a/4507507/501113
  • Merci de voir si la réponse est utile : stackoverflow.com/questions/34716456/...
  • Pour le suivi des curseurs ouverts dans Oracle, vous pouvez également jeter un oeil à la SYS.V$OPEN_CURSOR vue. Cela vous donnera non seulement le SID, mais aussi le texte SQL.