J'ai essayé de mettre à jour mon code ojdbc de ojdbc14-10.2.0.1.0 à ojdbc6-11.1.0.7.0. Nous avons utilisé OracleConnectionCacheImpl pour les connexions de sources de données, puis nous sommes passés au pool de connexions universelles en utilisant OracleDataSource au cœur. Voici comment nous avons configuré il au printemps:Gestion de la mémoire du pool de connexions universelles
<bean id="myDatasource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
<property name="URL" value="@[email protected]"/>
<property name="user" value="@[email protected]"/>
<property name="password" value="@[email protected]"/>
<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
<property name="connectionPoolName" value="MFR_RTE_POOL"/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="100"/>
<property name="validateConnectionOnBorrow" value="true" />
<property name="connectionWaitTimeout" value="30"/>
<property name="connectionHarvestMaxCount" value="25"/>
<property name="connectionHarvestTriggerCount" value="5"/>
<property name="maxStatements" value="100"/>
</bean>
Il a fallu un peu pour le faire fonctionner sans erreurs de connexion fermées, mais maintenant j'ai un problème avec la gestion de la mémoire. J'ai couru jconsole contre une application que j'ai qui utilise un ThreadPool. Cette application utilise un pool de threads et utilise ThreadPoolExecutors pour créer des demandes de frais basées sur les données transmises à partir du fichier. Un fichier peut contenir des centaines de milliers de demandes de frais. Mon problème est que la mémoire à long terme dans le tas se remplit et ne libère pas d'objets. Dans le test de performance que j'ai mis en place, la mémoire à long terme dans Garbage Collection se remplit dans environ 20-25 minutes et ne libère jamais. L'application finit par atteindre l'exception GC Limit Exceeded et se bloque.
Lorsque j'exécute le même test avec l'ancienne classe OracleConnectionCacheImpl, il fonctionne sans problème. Le pool de threads et tout le code qui l'accompagne ont été écrits pour s'exécuter en utilisant des versions plus anciennes de Spring (1.2.6) et d'anciens pilotes ojdbc, mais y a-t-il vraiment une différence de fonctionnement entre OracleConnectionCacheImpl et Universal Connection Pooling? Est-ce que je cherche à réécrire mon modèle de domaine si je veux adapter aux dernières versions du code du pilote JDBC d'Oracle. J'ai essayé la connexion OracleDataSource et il a lamentablement échoué avec NullPointerExceptions après avoir travaillé simultanément sur plusieurs fichiers. Je suis ensuite allé à UCP (à la suggestion d'un autre poste dans ce forum) qui fonctionne bien dans toutes les applications sauf une. À ce stade, j'essaie de déterminer si je peux optimiser davantage le bean Spring config pour ma source de données ou dois-je commencer à penser à la mise à niveau de la base de code. Comme indiqué précédemment, ce code fonctionne très bien par rapport à l'ancienne classe ojdbc, mais j'ai rencontré des problèmes à chaque étape de la mise en œuvre d'UCP. Je commence à me demander si cela vaut même la peine d'être amélioré.