IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Problème de connexions base de données non fermées avec dbcp.basicDataSource


Sujet :

Spring Java

  1. #1
    Membre du Club Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 58
    Points
    58
    Par défaut Problème de connexions base de données non fermées avec dbcp.basicDataSource
    Bonjour,

    je developpe une webapp avec spring pour ma partie DAO (sur une base Oracle 9) et je viens d'identifier un problème très gênant. D'abord, voici la config de mes objets d'accès DAO:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    <!-- ********** LowLevel Database Hitting ********** -->
     
    	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
            <property name="url" value="jdbc:oracle:thin:@server.fr.net.intra:1521:BOSFRDI2"/>
            <property name="username" value="user"/>
            <property name="password" value="password"/>
            <property name="maxActive" value="4"/>
            <property name="maxIdle" value="4"/>
            <property name="maxWait" value="5000"/>
            <property name="removeAbandoned" value="true"/>
            <property name="removeAbandonedTimeout" value="5000"/>
    	</bean>
     
    	<bean id="jdbcTemplate"
    		class="org.springframework.jdbc.core.JdbcTemplate">
    		<property name="dataSource"><ref bean="dataSource"/></property>
    	</bean>
     
    	<!-- ********** HighLevel Database Hitting and Log AOP ********** -->
     
    	<bean id="dbWriterTarget"
    		class="ubix.dbAccess.DbWriterImpl">
    		<property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
    	</bean>
     
    	<bean id="dbErrorLogger"
    		class="ubix.dbAccess.DbErrorLogger"/>
     
    	<bean id="dbWriter"
    		class="org.springframework.aop.framework.ProxyFactoryBean">
    		<property name="proxyInterfaces">
    			<value>ubix.dbAccess.DbWriter</value>
    		</property>
    		<property name="interceptorNames">
    			<list>
    				<value>dbErrorLogger</value>
    			</list>
    		</property>
    		<property name="target">
    			<ref bean="dbWriterTarget"/>
    		</property>
    	</bean>
    	<bean id="dbReaderTarget"
    		class="ubix.dbAccess.DbReaderImpl">
    		<property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
    		<property name="dbCache"><ref local="dbCache"/></property>
    	</bean>
    	<bean id="dbReader"
    		class="org.springframework.aop.framework.ProxyFactoryBean">
    		<property name="proxyInterfaces">
    			<value>ubix.dbAccess.DbReader</value>
    		</property>
    		<property name="interceptorNames">
    			<list>
    				<value>dbErrorLogger</value>
    			</list>
    		</property>
    		<property name="target">
    			<ref bean="dbReaderTarget"/>
    		</property>
    	</bean>
    pour résumer, mon DataSource est un BasicDataSource de apache commons. il est directement injecté dans mon JdbcTemplate par Spring, qui est à son tour injecté dans deux classes DbReader et DbWriter, qui servent donc à lire et à écrire dans la base. A noter que dans toute l'appli je me sers toujours de ces deux objets pour lire et écrire dans la base de données. Enfin on voit un proxy sur ces deux classes qui sert à intercepter et à logger les exceptions lors de l'accès à la base de données.

    En fait, en utilisation normale, tout ce passe bien, l'appli crée et détruit ses connections correctement. Je suis l'évolutions de ces dernières avec la vue v$session pour ceux qui connaissent oracle.

    Quand une erreur sql se produit, et donc que Dbreader ou Dbwriter renvoie une RuntimeException (provenant du JdbcTemplate), le proxy l'intercepte et la logge, mais les connections ouvertes par mon JdbcTemplate pour la ou les requêtes en cause ne semble pas être fermées. Du coup le nombre de sessions ouvertes sur la base augmente avec le temps et on finit par atteindre le maximum autorisé sur la base, ce qui bloque toute l'appli (et toute les autres qui utilisent la base aussi, tant qu'à faire).

    Quelqu'un saurait ce qu'il faut que je fasse pour fermer ses connections en cas d'erreur Oracle? Je n'ai pas trouvé dans les méthodes du jdbcTemplate de moyen de fermer la connexion en cours.

    N'hésitez pas à me demander du code supplémentaire au besoin. Je précise que je ne suis pas un super expert de Java, et que c'est ma première appli dans ce langage, donc n'hésitez pas non plus à pointer mes erreurs de conception.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Peut tu montrer une méthode d'un des target qui lance une erreur, ainsi que le code de l'intercepteur.

    Merci
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Membre du Club Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Voici le code du DbWriter c'est sur celui là que j'ai reproduit l'erreur mais je pense que le reader pose le problème aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class DbWriterImpl implements DbWriter{
    	private String sql;
    	private JdbcTemplate jdbcTemplate;
    	public void setSqlQuery(String sql){
    		this.sql= sql;
    	}
    	public void setSqlQuery(SqlQuery sql){
    		this.sql= sql.toString();
    	}
    	public int execute()throws UndefinedQueryException{
    		if (sql == null)
    			throw new UndefinedQueryException("Error: sql Query hasn't been set");
    		return jdbcTemplate.update(sql);
    	}
    	public void noLogExecute(){
    		try {
    			jdbcTemplate.update(sql);
    		}catch (Throwable e){
    			System.out.println("Non logged error: "+ e.getMessage());
    		}
    	}
    	public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
    		this.jdbcTemplate = jdbcTemplate;
    	}
    }
    Et voici le proxy qui logge les erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class DbErrorLogger implements ThrowsAdvice {
    	private static String ERRORLOGTYPE = "DBERROR";
    	public void afterThrowing(RuntimeException e){
    		Logger.logMsg("Error in Database Access: "+e.getClass()+": "+e.getMessage(),ERRORLOGTYPE);
    	}
    }

  4. #4
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Désole je ne vois pas ..

    Normalement JdbcTemplate s'occupe de fermer les connections ..
    Je ne comprends pas pq ca ne marche pas
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  5. #5
    Membre du Club Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    J'ai essayé a tout hasard de mettre à jour mon driver ojdbc, sachant que celui que j'utilisais était assez vieux, mais toujours pas de changement. Je vais tenter de désactiver mon Logger, car il écrit aussi en base, pour voir si çà ne vient pas de là.

Discussions similaires

  1. problème de connexion base de données 9i
    Par lamidouma dans le forum Connexions aux bases de données
    Réponses: 1
    Dernier message: 05/05/2008, 12h49
  2. [Débutant] Problème de Connexion base de données sous Glassfish
    Par kimlee dans le forum Glassfish et Payara
    Réponses: 4
    Dernier message: 20/01/2008, 13h56
  3. Problème de connexion à base de données MySQL
    Par Paulinho dans le forum Installation
    Réponses: 2
    Dernier message: 03/12/2007, 17h35
  4. [c#, WinForms]Problème de connexion à base de données
    Par Filippo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/05/2007, 09h47
  5. Réponses: 11
    Dernier message: 22/11/2006, 07h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo