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)
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>
L'attribut connectionCachingEnabled est censé géré ce type de souci mais il ne semble pas pris en compte.
J'ai un pool de connexion et voici comment je clear un connection en java

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 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".

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