2010-01-18 3 views
0

Je reçois lorsque la requête Après exécution à travers l'application webObtenir java.sql.SQLException: ORA-04031:

java.sql.SQLException: ORA-04031: 
java.sql.SQLException: ORA-04031: unable to allocate 48784 bytes of shared memory ("shared pool","SELECT emplid levempid, '2...","Typecheck","qry_text : qcpisqt") 

Mais même requête est en cours d'exécution par TOAD correctement.

+0

Ceci est un problème avec la configuration de votre serveur Oracle. La meilleure question apparait sur http://serverfault.com – skaffman

+0

Si la requête s'exécute correctement via un autre outil, il est peu probable qu'il y ait un problème de configuration du serveur. –

Répondre

8

Les chances sont très élevées que votre code Java n'utilise pas de variables de liaison. Dans ce cas, chaque instruction SQL est unique et ne sera pas réutilisée, saccageant le pool partagé. Il deviendra fragmenté et aboutira finalement à l'ORA-04031.

Redémarrer la base de données ne fonctionnera que temporairement, mais vous rencontrerez éventuellement les mêmes problèmes. Augmenter la taille du pool partagé et redémarrer régulièrement la base de données n'est pas une vraie solution. La seule vraie solution consiste à réécrire votre SQL pour utiliser des variables de liaison.

Voici un fil de AskTom d'une personne qui vit quelque chose de similaire: http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:528893984337

Et un petit programme pour suivre les instructions SQL ne utilisent pas des variables de liaison se trouve dans ce fil: http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1163635055580

Espoir CA aide.

Cordialement, Rob.

2

trouvé une question similaire sur oracle forum, et la solution qui semblait avoir le travail est:

L'utilisateur n'a pas server=dedicated dans leur entrée de tnsnames. L'ajout de cette ligne a fait fonctionner la requête.

Espérons que cela aide.

+0

Salut Son fonctionne bien après le redémarrage de la base de données – Vicky

+0

Et je pensais que cette solution fonctionne uniquement pour MS Windows;) – pugmarx

+0

Hey S'il vous plaît Fermer ceci son fonctionnement après le redémarrage de la base de données – Vicky

1

En Metalink, ils déclarent cela comme:

L'erreur ORA-04031 est généralement due à la fragmentation dans le cache de bibliothèque ou espace réservé piscine partagée. Avant d'augmenter la taille du pool partagé pensez à régler l'application pour utiliser sql partagé et affiner SHARED_POOL_SIZE, SHARED_POOL_RESERVED_SIZE et SHARED_POOL_RESERVED_MIN_ALLOC. d'abord déterminer si les ORA-04031 est le résultat de la fragmentation dans le cache bibliothèque ou dans la piscine partagée espace réservé en émettant la requête suivante:

SELECT free_space, avg_free_size, used_space, avg_used_size, request_failures, last_failure_size FROM v $ shared_pool_reserved; L'ORA-04031 est le résultat d'un manque d'espace contigu dans l'espace réservé du pool partagé si: REQUEST_FAILURES est> 0 et LAST_FAILURE_SIZE est> SHARED_POOL_RESERVED_MIN_ALLOC.

Pour résoudre ce SHARED_POOL_RESERVED_MIN_ALLOC considèrent de plus en plus d'abaisser le nombre d'objets mis en cache dans l'être espace réservé piscine partagée et augmentation SHARED_POOL_RESERVED_SIZE et SHARED_POOL_SIZE pour augmenter la mémoire disponible dans le pool partagé espace réservé.

L'ORA-04031 est le résultat d'un manque d'espace contigu dans le cache de la bibliothèque si:

REQUEST_FAILURES est> 0 et LAST_FAILURE_SIZE est < SHARED_POOL_RESERVED_MIN_ALLOC

ou

REQUEST_FAILURES est 0 et LAST_FAILURE_SIZE est < SHARED_POOL_RESERVED_MIN_ALLOC

e première étape serait d'envisager d'abaisser SHARED_POOL_RESERVED_MIN_ALLOC à mettre plus d'objets dans la piscine partagée espace réservé et augmenter SHARED_POOL_SIZE ......

Questions connexes