12
votes

Comment mettre à jour la limite de curseur pour ORA-01000: Les curseurs ouverts maximum dépassent

J'ai trouvé mon nombre maximum de curseurs par base de données 300 à partir de la requête suivante: xxx pré>

J'ai essayé de mettre à jour le montant à 1000 avec ceci: p>

SQL Error: ORA-02030: can only select from fixed tables/views
02030. 00000 -  "can only select from fixed tables/views"
*Cause:    An attempt is being made to perform an operation other than
           a retrieval from a fixed table/view.
*Action:   You may only select rows from fixed tables/views.


1 commentaires

La limite de 300 est par connexion , ce n'est pas une limite supérieure pour toutes les connexions ensemble. Dans la plupart des cas, ce message d'erreur indique un bogue sévère dans votre application, car il ne libère pas correctement les ressources. Vous devriez résoudre le problème dans l'application (la cause de la racine), ne pas combattre le symptôme.


3 Réponses :


17
votes

En supposant que vous utilisiez un SPFILE pour démarrer la base de données

alter system set open_cursors = 1000 


6 commentaires

Merci. Je l'ai poussé à 3k et je dépasse toujours le maximum open_cursors. Je ne crée pas de curseurs explicitement, donc je vais devoir examiner le code de la raison pour laquelle il génère tant de personnes. Il existe un couple préparé des déclarations et des résultats ouverts en même temps, mais ils sont tous fermés à terme, alors je ne pense pas que ce soit une fuite.


@Yellavon - Si nous parlons d'une application Java lorsque vous parlez de PreachStatement et RESUNTSET Des objets , je parie avec plaisir que vous ne fermez pas tout de fermeture correctement tous les temps. J'aurais placé un grand pari que l'application Java fuit des curseurs et que vous devrez déboguer cette question.


Je crois que tout se ferme parce que lorsque j'exécute cette méthode sur un jeu de données plus petit, cela fonctionne bien et la valeur du courant de curseur ouvert est la même avant et après sur le plus petit jeu de données. Je n'ai cependant pas imbriqué de préparation: ResultatsSet Rs = ps.executequery (); tandis que (rs.next ()) {long seqnum = rs.getlong (1); ps1.setlong (1, seqnum); ps1.close; } ps.close;


Bon appel sur les curseurs qui fuies: p Le code réutilisait préparetsatinements de sorte qu'il est donc difficile de dire ce qui se passait. Est-ce une bonne idée, créant un préparétstatment , générant des résultats avec celui-ci, la fermeture, puis réaffectant le préparé (code> avec une requête complètement différente? Je viens de le faire afin que la méthode () a été appelée une seule fois sur un préparéystatement et tous les Paretstatifs et Resulats ont été fermés.


Quelle est la valeur maximale?


@ ADIC.N. - 4294967295 à Oracle 10.1. Si vous envisagez de définir une valeur n'importe où près de cela, cependant, je vous exhorte fortement à reconsidérer et à trouver la fuite sous-jacente du curseur.



0
votes

Vous pouvez mettre à jour le paramètre sous init.ora dans Oracle \ app \ oracle \ product \ 11.2.0 \ Server \ config \ scripts


4 commentaires

Augmenter Open_Cursors est une idée horrible . Je n'ai pas encore vu une application qui a besoin de 300 curseurs ouverts. Tout ce que vous faites en augmentant la valeur, retarder le problème, ne pas résoudre le problème. Presque certainement une fuite de curseur.


@Bobc Et si nous parlons de plusieurs applications partageant une instance de base de données? Il y a des raisons légitimes d'augmenter les limites.


@charlie_pl Nope! Ceci est un paramètre par session.


@Bobc Évidemment, vous n'avez pas utilisé ArcGIS. :)



4
votes

Exécutez la requête suivante pour rechercher si vous exécutez SPFILE ou non:

alter system set open_cursors = 1000 ;


0 commentaires