4 nov. 2021 12:09:13 Thomas Dumont avatar

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;
}