|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : avril 2004 Messages : 168 ![]() |
Bonjour à tous,
Je cherche à comprendre ce qui se passe sur une base DB2 lors de l'exécution répétée d'une requête SQL effectuée via un driver JDBC (librairie JT400). Voici le code très simple que j'exécute : Code :
Via la commande wrkactjob sbs(qusrwrk), je visualise les travaux actifs, puis les fichiers ouverts pour le job qui m'intéresse. La première exécution de la requête ne tient aucun fichier ouvert, mais dès la seconde, le fichier correspondant à la table sur laquelle porte la requête est maintenu ouvert jusqu'à la fermeture de la connexion à la base. Mes questions sont donc les suivantes : qu'est-ce qui fait que le fichier est maintenu ouvert ? Et comment libérer les fichiers ? Merci d'avance pour votre aide !
__________________
The path of excess leads to the tower of wisdom. (Enigma) |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Patrick Inscription : mai 2008 Messages : 821 ![]() |
La première fois quand tu fais une requête, l'optimiseur construit son plan d'accès (le stocke dans le cache et dans ton cas dans un package *SQLPKG) puis créé l'ODP (Open Data Path).
A la fin de la première exécution, l'ODP est supprimée. C'est ce que l'on appelle un HARD CLOSE ou un FULL OPEN, comme tu voudras. A la seconde exécution, toujours plus rapide que la première car le plan d'accès étant créé, il fabrique à nouveau l'ODP (FULL OPEN) puis cette fois-ci, pour des raisons de performances ne la supprime pas (PSEUDO CLOSE) A la troisième exécution c'est encore plus rapide, pas de plan d'accès ni d'ODP à créer. Ta table n'est pas vraiment vérouillée comme tu le prétends. Elle peut être sauvegardée voire réorganisée, mais ça dépend de ta version. Pourquoi veut-il libérer la table ? Il y a très peu de moyens pour "libérer" les tables. D'abord sache que chaque ODP ouverte (pseudo close) après une requête "ne prend" environ que 1 Mo de mémoire. Mais multiplié par nombre de curseur/requête et de jobs, je te l'accorde ça peut vitegrimper. Tu peux "tuer" toutes les ODP en utilisant : Code :
ALCOBJ OBJ((BIB/MATABLE *FILE *EXCL)) CONFLICT(*RQSRLS) Mais à mon humble avis, utiliser les pseudo close est un gage de performances, il faudrait juste savoir pourquoi veux-tu libérer le tout. |
|
|
10
|
|
|
#3 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Bonjour,
J'ai fais un +1 sur K2R400 par contre je penses ne pas être d'accord sur un point avec lui. Je ne vois pas pourquoi un close connexion implique une suppression des odp. Pour moi les odp vont dégager quand le job associé à la QZDASOINIT va ce finir. De plus si votre code tourne sur un serveur d'application, il faut systématiquement faire une fermeture de la connexion quand vous avez récupéré votre resultSet. Sinon vous risquez d'avoir une saturation des connexions utilisé par votre appli. edit : ci-joint un exemple de code Java http://www.code400.com/viewsamples.php?lang_id=19 |
|
|
00
|
|
|
#4 | |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 168 ![]() |
Tout d'abord, merci pour vos réponses.
Pour tenter de répondre à un point de punkoff Citation:
Ensuite, voici des explications supplémentaires quant aux raisons de ce post. Le coeur de nos produits est fait de programmes RPG. Nos avons développés ces dernières années des modules JEE périphériques. Aujourd'hui, un de nos clients rencontrent le problème suivant : un de nos modules JEE ouvre un certains nombres de connexions et les maintient ouvertes (normal puisqu'on utilise un pool de connexion) mais cela engendre un gros ralentissement des programmes RPG. Dès que les connexions (donc les jobs associés) sont killées/fermées, tout redevient normal. Une piste donnée par IBM était de modifier le paramétrage de l'isolation de transaction (READ_UNCOMMITTED par défaut) et de tester avec les autrs valeurs READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE. C'est en réalisant ce test, que je me suis aperçu de ce comportement "bizarre" de mon point de vue (pas de fichier ouvert avant la seconde exécution d'une requête). D'après les explications de K2R400, je suppose que nous devons jouer sur le paramétrage du pool de connexions (réduire le nombre de connexions inactives maintenues ouvertes), à moins que vous n'ayez d'autres pistes à me soumettre ?
__________________
The path of excess leads to the tower of wisdom. (Enigma) |
|
|
|
00
|
|
|
#5 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Si vous étés en read-commited, faites vous bien des commit / rollback ?
l'auto-commit paramétré ce fait à quel moment ? edit: ok je n'utilise pas le bon vocabulaire, donc je vais m'abstenir de parler sur ce thread car j'ai peur de vous faire perdre du temps. J'ai confondu la cloture de connexion et cloture de statement : Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com