Bonjour,
J'utilise une connexion JNDI sur une base oracle avec un driver 11. La connexion et l'utilisation ne pose pas de souci. J'utilise des PL/SQL assez volumineuses dans mon application.
Cependant je me retrouve confronté à un souci de gestion de la mémoire de la part du driver Oracle.
Je m'explique.
L'application charge en mémoire le résultat de mes requêtes mais ne libère jamais la mémoire alloué. Elle ne le fait qu'au timeout de la session. J'ai beau faire de garbage collector, cela ne change rien.
Voici l'extrait de mon oracle-ds.xml (datasource oracle)
L'attribut connectionCachingEnabled est censé géré ce type de souci mais il ne semble pas pris en compte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 <datasources> <no-tx-datasource> <jndi-name>jdbc/APPLI</jndi-name> <connection-url>jdbc:oracle:thin:@123.123.123.123:9636:BASE</connection-url> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <user-name>MONUSERNAME</user-name> <password>MONPASSWORD</password> <min-pool-size>10</min-pool-size> <max-pool-size>10</max-pool-size> <idle-timeout-minutes>5</idle-timeout-minutes> <connection-property name="connectionCachingEnabled">true</connection-property> <connection-property name="connectionCacheName">TestCache</connection-property> <track-statements/> <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name> <prepared-statement-cache-size>20</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> <metadata> <type-mapping>Oracle9i</type-mapping> </metadata> </no-tx-datasource> </datasources>
J'ai un pool de connexion et voici comment je clear un connection en java
En profilant l'application on voit bien la mémoir montée régulièrement au fur et à mesure que l'on passe les appel à PL/SQL. Jusqu'à ce l'appli plante en "Java Heap Space".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 userContext.getConnection().close(); Connection newConnection = getConnection(); userContext.setConnection(newConnection); beginTransaction(userContext);
En lisant la doc suivante
Oracle JDBC Memory Management j'ai testé un certain nombre des modifications qu'ils préconisent mais sans succés. On voit à travers ce document que la gestion mémoire du driver Oracle semble assez aléatoire.
Est-ce que quelqu'un aurait une piste sur mon souci ? Pour parler plus pragmatique, savez-vous libérer la mémoire stocké par le driver Oracle dans une application avec JNDI et un pool de connexion sur le driver 11 d'Oracle.
Merci d'avance
Partager