Le pool de connexion consiste en la mise à disposition d'une liste de sessions préalablement ouvertes sur une base de données. Ces sessions sont disponibles pour un ensemble de programmes, en utilisant un alias spécifique lors de la connexion à la base. Le pool offre un gain de quelques millisecondes lors de la création/suppression de la session sur la base de données : les sessions sont en effet créées lors du premier appel et laissées disponibles à la fermeture de la connexion.
Il faut cependant que chaque programme ferme bien sa connexion, au risque sinon de ne plus laisser de sessions disponibles pour les prochains appelants. De même, si trop de programmes souhaitent utiliser une connexion, il faut avoir préalablement bien dimensionné le pool. Dans le cas inverse, une erreur similaire à "Unable to connect to datasource using a pooled database connection" survient (ou également "Unable to get a pooled database connection from pool").
Bien qu'ouvertes sur la base, le cycle de vie de ces sessions est géré par un programme spécifique, externe à celles-ci. Il faut donc pouvoir les superviser par un autre moyen qu'avec les outils d'administration de base de données.
Paramétrer le traitement Talend
Sur Talend, il faut utiliser l'alias de source de données sur le composant qui établit la connexion :
- Ouvrez votre traitement sur Talend, sélectionnez votre composant de connexion à la base (tDBConnection)
- Paramétrer la connexion de façon classique
- Cochez la case "Spécifier l'alias de la source de données" et entrez l'alias que vous souhaitez. Ce nom sera à réutiliser dans le paramétrage de la source, à l'étape suivante.
Créer le fichier de configuration du pool
Il faut créer un fichier xml (par exemple databasesource-MS-oracle-test.xml) dans le répertoire "deploy" de Karaf. Voici son contenu pour une base de données Oracle, à adapter au niveau des paramètres de connexion et de taille de pool.
Ce fichier contient le nom de l'alias (dans la partie service) déclaré sur le composant Talend.
Un nom de connexion et à mettre pour "connectionPoolName", afin de pouvoir monitorer la connexion avec JMX (à la fin de ce document).
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
<bean id="datasource-MS-oracle-test" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
<property name="URL" value="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.10)(PORT=1526))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MonSchema)))"/>
<property name="user" value="monIdent"/>
<property name="password" value="monMotPasse"/>
<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource" />
<property name="connectionPoolName" value="TEST_POOL" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="8" />
<property name="initialPoolSize" value="2" />
<property name="inactiveConnectionTimeout" value="120" />
<property name="validateConnectionOnBorrow" value="true" />
<property name="maxStatements" value="10" />
</bean>
<!-- Si un bundle utilise un alias, cela cree une dépendance a javax.sql.DataSource. Voici comment la diriger vers MSDataSourceTest -->
<service ref="datasource-MS-oracle-test" interface="javax.sql.DataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="MSDataSourceTest"/>
</service-properties>
</service>
</blueprint>
Installer les dépendances sur Karaf
Pour exploiter la base de données Oracle, il faut que le bundle ojdbc8.jar soit déployé (pour JDK 8). Pour d'autres versions, comme pour JDK 11, téléchargez la librairie correspondante sur www.oracle.com/fr/database/technologies/appdev/jdbc-downloads.html.
Déposer le fichier jar téléchargé dans le répertoire deploy de Karaf.
Enfin, pour gérer le pool de connexions il est nécessaire que la librairie Universal Connection Pool (contenant la classe PoolDataSourceFactory) soit connue. Démarrez Karaf, puis exécutez la commande suivante pour la télécharger et l'installer automatiquement depuis Maven :
bundle:install -s wrap:mvn:com.oracle.database.jdbc/ucp/21.7.0.0
Une fois ces commandes terminées, vous pouvez déployer votre service ou route sur le runtime.
Monitorer le pool de connexions
Il convient de surveiller le pool de connexions à l'aide de JMX :
- Ouvrez jconsole.exe (présent dans le JDK)
- Connectez-vous sur votre instance. Par défaut, c'est service:jmx:rmi://<serveur>:44444/jndi/rmi://<serveur>:1099/karaf-trun avec les identifiants/mot de passe "karaf" (en remplaçant <serveur> par l'IP ou le nom de la machine).
- Allez sur l'onglet MBeans et positionnez vous sur oracle.ucp.admin.UniversalConnectionPoolMBean. Attention : ce MBean n'apparaît qu'après la première connexion à la base de données.
- Vous devriez voir un sous-niveau portant le nom de votre pool ("TEST_POOL" ici). Les éléments intéressants à surveiller sont surtout :
- remainingPoolCapacityCount : indique le nombre de sessions de pool libres
- totalConnectionCount : indique le nombre de sessions créées
- maxPoolSize : le nombre de sessions maximum, paramétré à la 2ème étape
Quelques cas d'erreurs
- "oracle/jdbc/OracleConnection$ConnectionValidation" : la librairie UCP n'a pas été installée. Refaites l'étape d'installation des dépendance.
- "Unresolved requirement: Import-Package: oracle.ucp.jdbc" : : la librairie UCP n'a pas été installée. Refaites l'étape d'installation des dépendance.
- "tDBConnection_1 nulljava.lang.NullPointerException: null at routines.system.TalendDataSource.getConnection(TalendDataSource.java:26) ~[routines-7.3.1.jar:?]" : le JDK n'est pas compatible, téléchargez un JDK plus récent
- "Error Datasource is not an instance of DataSource nor XADataSource" : le JDK n'est pas compatible, téléchargez un JDK plus récent