Oracle permet de ne pas supprimer les curseurs après la fermeture de l'ensemble de résultats
Remarque: nous réutilisation de connexion unique.
************************************************
public Connection connection() {
try {
if ((connection == null) || (connection.isClosed()))
{
if (connection!=null)
log.severe("Connection was closed !");
connection = DriverManager.getConnection(jdbcURL, username, password);
}
} catch (SQLException e) {
log.severe("can't connect: " + e.getMessage());
}
return connection;
}
**************************************************
public IngisObject[] select(String query, String idColumnName, String[] columns) {
Connection con = connection();
Vector<IngisObject> objects = new Vector<IngisObject>();
try {
Statement stmt = con.createStatement();
String sql = query;
ResultSet rs =stmt.executeQuery(sql);//oracle increases cursors count here
while(rs.next()) {
IngisObject o = new IngisObject("New Result");
o.setIdColumnName(idColumnName);
o.setDatabase(this);
for(String column: columns)
o.attrs().put(column, rs.getObject(column));
objects.add(o);
}
rs.close();//oracle don't decrease cursor count here, while it's expected
stmt.close();
}
catch (SQLException ex) {
System.out.println(query);
ex.printStackTrace();
}
Êtes-vous référant à "ORA-01000: un maximum de curseurs ouverts dépassé"? Si oui, reportez-vous à asktom.oracle.com/pls/asktom/... pour une explication.
Michels qui semble utile. Pourriez-vous ajouter comme une réponse?
Il a essayé d'écrire un court résumé. En Ce Qui Concerne Meilleur.
Un antivirus est en cours d'Exécution sur le Serveur de Base de données? Si l'antivirus est nécessaire sur votre serveur de base de données (ce qui n'est pas une bonne pratique - comme beaucoup l'ont souligné), au moins avoir un l'exclusion dans la numérisation des fichiers de base de données et serveur de base de données binaires.
Michels qui semble utile. Pourriez-vous ajouter comme une réponse?
Il a essayé d'écrire un court résumé. En Ce Qui Concerne Meilleur.
Un antivirus est en cours d'Exécution sur le Serveur de Base de données? Si l'antivirus est nécessaire sur votre serveur de base de données (ce qui n'est pas une bonne pratique - comme beaucoup l'ont souligné), au moins avoir un l'exclusion dans la numérisation des fichiers de base de données et serveur de base de données binaires.
OriginalL'auteur Vladimir | 2010-04-01
Vous devez vous connecter pour publier un commentaire.
L'init.ora paramètre
open_cursors
définit le maximum de ouvert les curseurs d'une session peut avoir à la fois. Il a une valeur par défaut de 50. Si la demande dépasse ce nombre, le message d'erreur "ORA-01000: un maximum de curseurs ouverts dépassé" est déclenché.Par conséquent, il est obligatoire de fermer les ressources JDBC quand ils ne sont pas nécessaires, en particulier java.sql.Jeu de résultats et de java.sql.L'énoncé. Si elles ne sont pas fermées, l'application a une fuite de ressources.
En cas de réutilisation de l'objet de Connexion, vous devez être conscient du fait que l'ouverture d'un oracle curseurs sont ouverts et en utilisation de la connexion existe et la transaction n'est pas terminée. Lorsque l'application s'engage, le ouvert les curseurs sont libérés.
Donc comme un concepteur d'application que vous devez savoir à une estimation approximative du besoin d'ouvrir les curseurs pour votre opération complexe.
La difficulté réside dans l'incapacité de oracle paramètre interne vues v$open_cursor, v$sesstat, et. al.) pour montrer la différence entre ouvert curseurs, qui sont réutilisables et ouvert curseurs, qui sont toujours bloqués (non réutilisable!) par un unclosed ResulSet ou de la Déclaration. Si vous fermez toutes les déclarations et les objets ResultSet dans votre bloc finally, votre application est parfaitement bien.
Réglage init.ora paramètre fonctionne comme ceci (notre application a besoin de 800 curseurs au maximum)
Hy, j'ai un DBconnection avec open_cursor=150, autocommit=false. Je ferme tous mes PreparedStatement et ResultSet mais j'ai ce problème. Il pourrait être en raison de déclencheurs qui commencent après quelques delete et insert, mais l'insertion de commettre afetr qui peut être dangereux, parce que lorsqu'il est commis toutes les transactions maded à ce point, et si elle est alors en othe rparts des programmes de quelque chose tombe en panne, je ne peux pas faire une véritable restauration de l'ensemble de la transaction. toute suggestion?
s'engageant dans des déclencheurs est votre chemin direct vers l'enfer; -), Essayez d'augmenter votre open_cursors réglage.
OriginalL'auteur
Normalement, vous mettrais la clôture relevés de votre jeu de résultats et l'Instruction dans un
finally
block pour s'assurer qu'ils sont appelés, même si une exception se produit (peut-être le problème que vous rencontrez ici). Dans votre code, si une SQLException se produit, alors les deux méthode close( ) appels n'arrivera jamais et les curseurs sont laissées en suspens.Aussi quelle requête êtes-vous à l'aide dans l'Oracle de voir le nombre de curseurs ouverts?
Edit:
Ce code devrait être de fermer le curseur. Si ce n'est pas le cas, alors vous devriez être capable de voir un 1 à 1 de corrélation de l'appel de votre méthode et le curseur va compter par 1. Assurez-vous il n'y a pas un processus inattendu qui est à l'origine du curseur comptent aller jusqu'.
Si vous avez les privilèges, vous pouvez exécuter cette requête sur la base de données pour voir le curseur ouvert à compter par sid pour voir si peut-être il est un autre processus qui est en augmentant les curseurs et pas le vôtre en particulier. Il va tirer en arrière avec plus de 10 curseurs ouverts, vous pouvez augmenter cette valeur pour filtrer le bruit ou le réduire spécifiquement par nom d'utilisateur ou osuser:
Une autre requête qui peut être utile, au cas où plusieurs sid sont à l'aide de la même chaîne de requête ci-dessus ne fait pas apparaître le délinquant:
Je sais que c'est mieux de les fermer enfin. Mais excpetion n'est pas un problème. Il ne se produit pas dans mes tests.
J'ai ajouté des informations supplémentaires à ma réponse. Votre code doit être de travail si aucune exception n'est levée. Regarder le sid niveau et assurez-vous qu'elle est votre seul processus qui affecte le curseur comte.
je vous remercie. Je vais essayer ça.
cette requête m'a aidé à comprendre le problème (en fin de compte, j'ai été accidentellement "fuite" preparedstatements en java, oups)
OriginalL'auteur
La bonne façon de le faire est de fermer toutes les ressources dans un bloc finally dans son propre bloc try/catch. J'ai l'habitude d'utiliser un statique de la classe utilitaire comme ceci:
Alors j'aimerais écrire votre code comme ceci:
OriginalL'auteur
J'ai juste eu le même problème et a trouvé que si vous ne pas fermer la connexion (parce que vous aurez peut-être la réutiliser plus tard) - vous au moins d'avoir à faire un connexion.rollback() ou connexion.commit() gratuit les curseurs ouverts togehther avec la fermeture du jeu de résultats et les Déclarations.
Jiddewar De la corse, vous devez fermer le jeu de résultats. Mais comme la question est à propos de curseurs ouverts après la fermeture de la ResultSet je viens de remarquer que vous devez le faire à une connexion de restauration/s'engager à libérer le curseur. Donc, rien à contredire 🙂
Dans mon cas, j'ai dû fermer la connexion immédiatement.. commit / rollback n'a pas beaucoup d'aide.
OriginalL'auteur