jeudi 3 janvier 2008

Configurer ses datasources tomcat ou jonas et Spring

Récupérer la datasource dans le code

        Context initialContext = null;
log.error("Initializing supervision servlet");
try {
initialContext = new InitialContext();
DataSource dataSource = (DataSource) initialContext
.lookup("java:comp/env/jdbc/Journal");
connection = dataSource.getConnection();
} catch (Exception e) {
log.error("Cannot get initial context for JNDI: ");
e.printStackTrace();
log.error(e);
}



Une connexion est obtenue à partir du DataSource. Cette connexion est une implémentation particulière puisque son appel à la méthode close() ne la ferme pas réellement mais la rend à nouveau disponible au pool de connexion. Sans cette action permet la connexion ne se libère pas. Pour cette raison, il est très important que la méthode close soit appelée et même en cas d'exception. Sans cela, sans cela le pool de la database perd des connections et il peut résulter une insiponibilité de la database.

Le mieux est de faire close() de la session dans un bloc finally pour garantir son appel.


try{
connection=getConnection(); // Permet de récupérer une connexion à partir du DataSource
...
traitement
...
resultSet.close();
connection.close();
logger.debug(infoDossiers.size() + " dossiers retournés");
return infoDossiers;
} catch (SQLException e) {
try {
logger
.error(
"Erreur lors de la requête de récupération des infos du dossier pour l'identifiant : "
+ identifiant
+ " de type : "
+ typeIdentifiant
+ " pour l'année :"
+ annee, e);
if (connection != null) {
connection.close();
}
} catch (SQLException e1) {
logger.error("Erreur lors de fermeture de la connection");
}





Le fichier context.xml définit cette data source. Il peut être placé dans le répertoire META-INF/context.xml, dans ce cas, il est rechargé à chaque déploiement. La ressource peut aussi être définie au niveau du Host en créant un fichier context.xml.default dans le répertoire conf/Catalina/localhost de tomcat. Dans ce cas le déploiement ne reconfigure pas la datasource. Le fichier de context s'écrit :



<Context displayName="Calam-WS"  path="/calam-ws">
<Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="2" maxWait="5000"
username="myuser" password="mypass" driverClassName="com.sybase.jdbc3.jdbc.SybDriver"
url="jdbc:sybase:Tds:ouaga:5000/MyBase</Context>





Au moment de récuppérer l'URL on pourra avoir de problèmes de classpath, dans ce ca le mettre dans les librairies commns de tomcat

Dans le cas d'une utilisation au sein de Spring. Le fichier dao-context.xml a été modifié pour utiliser les datasources

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
destroy-method="close">
<property name="jndiName" value="java:comp/env/jdbc/my-datasource" />
</bean>


Cette datasource se définit dans le fichier context.xml de votre serveur tomcat de eclipse, préciser la datasource.

<Context path="/myapp" docBase="myapp-ihm"
debug="5" reloadable="true" crossContext="true">

<Resource name="jdbc/my-datasource" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="password" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"/>
</Context>


Ensuite copier la librairie connector-mysql (Z:\00-DOSSIER_PROD\DEquipe\Produits\Poste dev\mysql-connector-java-5.0.5.jar ). Dans votre répertoire lib de tomcat

A l'issue de ces manipulations, un clean et une publication seront prudent.


Installer des datasources sous JONAS



Dans le fichier conf/jonas.properties de votre serveur d'application, ajouter les datasources séparée par des virgules :

jonas.service.dbm.datasources    my_datasource1


Créer le fichier
my_datasource1.properties dans votre répertoire conf et y ajouter les propriétés de votre datasources

#This file is generated by JOnAS
#Fri Feb 26 14:16:50 CET 2010
jdbc.maxconpool=-1
jdbc.connmaxage=1440
jdbc.maxwaittime=10
datasource.url=\ jdbc\:mysql\://my-db\:3306/mydb
datasource.description=no desc
datasource.mapper=rdb
jdbc.minconpool=0
jdbc.connteststmt=SELECT 1
datasource.username=myuser
datasource.name=ftjobs_1
datasource.classname=com.mysql.jdbc.Driver
jdbc.maxwaiters=1000
datasource.password=mypassword
jdbc.connchecklevel=1
jdbc.maxopentime=1440



Créer un fichier jonas-web dans le répertoire WEB-INF de votre application

<jonas-web-app>
<jonas-resource>
<res-ref-name>jdbc/my-datasource</res-ref-name>
<jndi-name>mydatasource_1</jndi-name>
</jonas-resource>
</jonas-web-app>

1 commentaire:

Anonyme a dit…

Certainly. It was and with me. Let's discuss this question. Here or in PM.