Accès aux données
Les pools de connexions et db.properties
La déclaration d'un pool de connexion se fait dans le fichier db.properties situé dans le répertoire WEB-INF/conf.
Lutèce dispose par défaut d'un pool de connexion portal à la base contenant les données du portail.
#portal.poolservice is not a mandatory property portal.poolservice=fr.paris.lutece.util.pool.service.LuteceConnectionService portal.driver=com.mysql.jdbc.Driver portal.url=jdbc:mysql://localhost/lutece?autoReconnect=true&useUnicode=yes&characterEncoding=utf8 portal.user=root portal.password=motdepasse portal.initconns=2 portal.maxconns=50 portal.logintimeout=2 portal.checkvalidconnectionsql=SELECT 1 # <pool>.dialect is an optional property to specify the dialect for JPA provider. #portal.dialect=org.hibernate.dialect.MySQLDialect
Il est possible de déclarer d'autres pools de connexion vers d'autres bases pour les besoins de certains plugins.
Chaque pool de connexion peut utiliser le service de connexion Lutèce, ou bien le service de connexion du serveur Tomcat :
Service de connexion Lutèce
db.properties
# Pool for a specific plugin database <pool_name>.poolservice=fr.paris.lutece.util.pool.service.LuteceConnectionService <pool_name>.driver=com.mysql.jdbc.Driver <pool_name>.url=jdbc:mysql://localhost/lutece?autoReconnect=true&useUnicode=yes&characterEncoding=utf8 <pool_name>.user= <pool_name>.password= <pool_name>.initconns=1 <pool_name>.maxconns=3 <pool_name>.logintimeout=2000 <pool_name>.checkvalidconnectionsql=SELECT 1
Les propriétés d'un pool sont les suivantes :
Nom | Description |
---|---|
poolservice (optionnel) | Le nom de la classe de Lutece qui devra gérer les demandes de connexions sur le pool. Par défaut le service est celui de Lutèce |
driver | Le nom de la classe du driver JDBC |
url | L'URL JDBC de connexion à la base de données contenant notamment le protocol, le numéro de port éventuel, le nom du serveur et celui de la base |
user | Le nom de l'utilisateur de la base de données |
password | Le mot de passe de l'utilisateur de la base de données |
initconns | Le nombre de connexions à ouvrir à la création du pool |
maxconns | Le nombre de connexions maximum sur le pool |
logintimeout | Le délai en milli secondes pour abondonner une tentative de connexion à la base de données. |
checkvalidconnectionsql (optionnel) | Ce paramètre contient la requête SQL qui permet de vérifier qu'une connexion au pool est valide. La valeur par défaut est SELECT 1 qui fonctionne pour MySQL. Pour Oracle, ce paramètre doit être défini avec la requête suivante : SELECT SYSDATE FROM dual. |
Service de connexion Tomcat
db.properties
# Pool for a specific plugin database <pool_name>.poolservice=fr.paris.lutece.util.pool.service.TomcatConnectionService <pool_name>.ds=jdbc/<resource_name>
Les propriétés d'un pool sont les suivantes :
Nom | Description |
---|---|
poolservice | Le nom de la classe de Lutece qui devra gérer les demandes de connexions sur le pool |
ds | Le nom de la ressource correspondant au pool dans le context Tomcat |
Configuration Tomcat
Dans le fichier server.xml de Tomcat (TOMCAT_HOME/conf), il faut rajouter la balise Context :
<Server> … <Service> … <Engine> … <Host> … <Context docBase="<absolute_path>" path="<context_name>" reloadable="true" > … </Context> </Host> </Engine> </Service> </Server>
- <absolute_path> est le chemin absolu de la webapp du site (ex : « TOMCAT_HOME\webapps\lutece »),
- <context_name> est le nom du contexte pour Tomcat (ex : « /lutece »).
Pour chaque pool de connexion existant, il faut également rajouter les lignes suivantes à l’intérieur de la balise <Context> … </Context> définie ci-dessus :
<Resource name="jdbc/<resource_name>" auth="Container" type="javax.sql.DataSource" username="<user_name>" password="<password>" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://<database_url>/<database_name>?autoReconnect=true&autoReconnectForPools=true&zeroDateTimeBehavior=convertToNull&useUnicode=yes&characterEncoding=utf8" initialSize="2" maxActive="20" removeAbandoned="true" logAbandoned="true" removeAbandonedTimeout="300" />
- <resource_name> est le nom de la ressource défini pour le pool en question dans le fichier db.properties,
- <user_name> est le nom utilisateur de connexion à la base de données,
- <password> est le mot de passe de connexion à la base de données,
- <database_url> est l’url d’accès au serveur de bases de données,
- <database_name> est le nom de la base de données.
Le pattern DAO
Comme décrit dans le Architecture générale, la persistance en base de données est assurée par des objets respectant le pattern DAO défini dans la spécification J2EE. L'implémentation d'un DAO est réalisée à l'aide de la classe utilitaire DAOUtil.
DAOUtil
La classe utilitaire DAOUtil permet de créer des objets qui fournissent une interface pour l'ensemble des opérations d'accès aux :
- Récupération d'une connexion à partir d'un pool
- Préparation d'un ordre SQL
- Définition des éléments variables de l'ordre SQL
- Exécution de l'ordre
- Récupération et parcours éventuel des résultats
- Remise à disposition de la connexion dans le poll
Voici un exemple d'utilisation d'un objet DAOUtil :
private static final String SQL_QUERY_SELECT = "SELECT id_contact, description, email, contact_order FROM contact WHERE id_contact = ? "; ... Contact load( int nContactId , Plugin plugin ) { DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT , plugin ); daoUtil.setInt( 1 , nContactId ); daoUtil.executeQuery(); Contact contact = null; if ( daoUtil.first( ) ) { contact = new Contact(); contact.setId( daoUtil.getInt( 1 ) ); contact.setName( daoUtil.getString( 2 ) ); contact.setEmail( daoUtil.getString( 3 ) ); contact.setContactOrder( daoUtil.getInt( 4 ) ); } daoUtil.free(); return contact; }