04 10 2008

Transactions XA avec SQL Server

Si vous avez besoin d’accéder à plusieurs bases de données SQL Server via votre application JEE et le tout bien sûr dans une même transaction, voici les différentes actions à entreprendre pour que cela fonctionne.

Configurer SQL Server

Et oui, on ne peut pas simplement dire qu’on utilise une datasource XA, SQL Server doit disposer de différents éléments (notamment des procédures stockées spécifiques) pour que cela fonctionne.

  • Pré-requis : SQL Serveur ne doit pas être installé sur Windows XP, des problèmes ont été rencontré sur cet OS, préférer Windows Server 2003.
  • Récupérer les drivers jdbc Microsoft pour SQL Server (1.2).
  • Décompresser l’archive, aller dans le répertoire xa et choisir l’architecture de la machine (x86 ou 64bits).
  • Copier la dll sqljdbc_xa.dll dans le répertoire Binn de l’installation de SQL Server (ex : C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\Binn\).
  • Exécuter le script sql (xa_install.sql). Cela va créer des procédures stockées liées à XA (notamment master..xp_sqljdbc_xa_init).
  • L’utilisateur qui se connecte aux bases pour effectuer des requêtes transactionnées, typiquement l’utilisateur de votre application doit disposer du rôle SqlJDBCXAUser :
      use master
      go
      EXEC sp_grantdbaccess 'username', ' username'
      go
      EXEC sp_addrolemember \[SqlJDBCXAUser\], ' username'
      go

Configurer le DTC

Ne le prenez pas mal, mais c’est comme cela qu’il s’appelle : le Distributed Transaction Coordinator (plus communément appelé MSDTC). C’est le service qui gère les transactions distribuées (transactions entre plusieurs bases). Plusieurs choses à vérifier à ce niveau :

  • Vérifier que le service est démarré. Si ce n’est pas le cas, vous risquez une erreur du genre :
Caused by: javax.transaction.xa.XAException: java.sql.SQLException: Failed to create the XA control connection. Error: xp_sqljdbc_xa_init failure, status:0 msg:*** SQLJDBC_XA DTC_ERROR Context: xa_init, state=1, StatusCode:0 (0x00000000) ***.
at com.microsoft.sqlserver.jdbc.SQLServerXAResource.start(Unknown Source)
  • Il faut ensuite autoriser les transactions XA (extrait de la msdn) :
  1. Dans le Panneau de configuration, ouvrez Outils d’administration, puis ouvrez Services de composants.
  2. Développez Services de composants, cliquez avec le bouton droit de la souris sur Poste de travail et sélectionnez Propriétés.
  3. Cliquez sur l’onglet MSDTC, puis sur Configuration de la sécurité.
  4. Activez la case à cocher Transactions XA, puis cliquez sur OK. Ceci entraînera le redémarrage du service MS DTC.
  5. Cliquez à nouveau sur OK pour fermer la boîte de dialogue Propriétés, puis fermez Services de composants.
  6. Arrêtez puis redémarrez SQL Server afin de garantir la synchronisation avec les modifications de MS DTC.

Configurer l’application

Personnellement, j’utilise Spring 2.5 et Hibernate, mais vous pouvez travailler sur des versions antérieures, ca marchera aussi. Spring 2.5 fournit surtout des raccourcis…

Datasources

Vous déclarez vos datasources comme à votre habitude. En spring 2.5, vous pouvez simplement mettre :

<jee:jndi-lookup id="dataSource1" jndi-name="java:comp/env/jdbc/db1"/>
<jee:jndi-lookup id="dataSource2" jndi-name="java:comp/env/jdbc/db2"/>

Transaction JTA

C’est là que Spring 2.5 est intéressant car vous n’avez qu’à préciser <tx:jta-transaction-manager/> dans votre configuration spring pour qu’il se débrouille : il vérifie le type de serveur d’application dont vous disposez et choisit le transaction manager approprié. Par exemple pour Websphere, il utilisera le WebSphereUowTransactionManager. Plus de détails sur les transactions spring ici.

Configurer le serveur d’application

Au niveau du serveur d’application, vous devez configurer les ressources jndi pour les datasources. Pour ce faire, utilisez la classe com.microsoft.sqlserver.jdbc.SQLServerXADataSource. Pour le reste, c’est du standard : configurez l’url, l’utilisateur, le password…

Conclusion

Alors que côté JEE, on reste dans une configuration assez standard et simple à mettre en place, niveau base de donnée, on a pas mal de choses à faire qui ne sont pas innées et qui ne s’inventent pas.

Leave a comment

Your comment

CAPTCHA image