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

Frameworks Web Java Discussion :

Configuration MySql avec Hibernate et Spring


Sujet :

Frameworks Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut Configuration MySql avec Hibernate et Spring
    Bonjour

    je suis en train de développer une application JavaEE avec MySql, Hibernate et Spring.

    Je rencontre un problème de configuration, que je n'arrive pas a cibler :

    MySql est paramétrée pour accueillir un max de 100 connexions.
    Hibernate devrait gérer un pool de 20 connexions.

    MySql me renvoie systématiquement "Too many connexions" quand j'arrive a une centaine d'accès à la base.

    J'en déduis qu'hibernate n'est pas correctement configuré ?

    my.ini (paramètres par défaut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    max_connections=100
    hibernate.cfg.xml
    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
     
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
            <property name="hibernate.connection.pool_size">20</property>
            <property name="hibernate.connection.release_mode">auto</property>
     
            <property name="show_sql">false</property>
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     
            <property name="current_session_context_class">thread</property>
            <property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property>
     
            <property name="hibernate.cache.use_query_cache">false</property>
            <property name="hibernate.cache.use_second_level_cache">false</property>
     
            <!-- Mapping files -->
            <mapping resource="fr/vivreaction/hibernate/Action.hbm.xml" />
           .....
        </session-factory>
    </hibernate-configuration>
    Dans mon applicationContext.xml
    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
     
     
    	<!-- sessionFactory  -->
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close">
    		<property name="configLocation">
    			<value>classpath:hibernate.cfg.xml</value>
    		</property>
    	</bean>
     
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory" ref="sessionFactory"/>
    	</bean>
    	<bean id="transactionProxy" abstract="true"
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager" ref="transactionManager"/>
    		<property name="transactionAttributes">
    			<props>
    				<prop key="insert*">PROPAGATION_REQUIRED</prop>
    				<prop key="update*">PROPAGATION_REQUIRED</prop>
    				<prop key="save*">PROPAGATION_REQUIRED</prop>
    				<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
    			</props>
    		</property>
    	</bean>
     
       .....
    L'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    	at org.hibernate.loader.Loader.doList(Loader.java:2294)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
    	at org.hibernate.loader.Loader.list(Loader.java:2167)
    	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
    	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
    	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
     
    ....
     
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
    Merci de votre aide !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Tu fermes bien tes sessions après utilisation pour libération du pool ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    non.

    j'ai lu qu'en déléguant les trasactions a Spring, je n'avais plus besoin que de faire du getSession().[save/merge]

    je vais remettre getSession().close() dans mes finally alors .. c ca ?

    Merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    Re

    en fait ca ne résout pas le problème.

    Voila le DAO que j'appelle pour reproduire mon bug :
    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
     
     
    		Session session = getSession();
    		try {
    			Query query = session.createQuery("from Action");
     
    			List<Action> result = new ArrayList<Action>();
     
    			result.addAll(query.list());
     
    			return result;
     
    		} catch (RuntimeException re) {
    			log.error("get failed", re);
    			throw re;
    		} finally {
    			session.close();
    		}
    mais j'ai mis ce block finally sur toutes mes méthodes DAO.

    Merci d'avance.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Si tu veux calquer tes sessions sur tes transactions, ne devrais-tu pas utiliser hibernate.current_session_context_class = jta, à la place de thread ?

    Effectivement, avec les sessions contextuelles, le close est réalisé pour toi.

    Tu utilises une couche de service au dessus de tes DAOs ?
    Celle-ci est-elle bien configurée ?

    Montre le reste de ton DAO et ton fichier de conf spring.

    Ensuite, ton pool n'est à priori pas bien configuré pour un environnement de production, mais tu n'en es surement pas encore là.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    Merci de ta réponse

    Si tu veux calquer tes sessions sur tes transactions, ne devrais-tu pas utiliser hibernate.current_session_context_class = jta, à la place de thread ?
    Effectivement, je vois ca dans la doc HIbernate 3.1 chapitre 2.5, c'est JTA qui doit etre utilisé a la place de thread a partir de hibernate 3.0.1.
    Je ne pense pas avoir besoin spécifiquement de sessions contextuelles. j'enlève donc cette config (qui me reste d'un tutoriel).

    Tu utilises une couche de service au dessus de tes DAOs ?
    Celle-ci est-elle bien configurée ?
    Montre le reste de ton DAO et ton fichier de conf spring.
    oui j'utilise une couche de service que j'instancie avec Spring

    applicationContext.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    	<bean id="actionService" class="fr.vivreaction.business.ActionService" >
        	<property name="actionDao" ref="actionDao"/>
    	</bean>
     
        <bean id="actionDao" class="fr.vivreaction.hibernate.dao.ActionDao">
         	<property name="sessionFactory" ref="sessionFactory" />
    	</bean>
    mon DAO extend HibernateDaoSupport, et implémente une interface.
    rien de plus

    Ensuite, ton pool n'est à priori pas bien configuré pour un environnement de production, mais tu n'en es surement pas encore là.
    J'en suis conscient, je suis en développement, et je reviendrai surement par ici le moment venu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de recuperation d'une liste avec Hibernate et Spring
    Par fabiolerusse dans le forum Hibernate
    Réponses: 4
    Dernier message: 22/05/2008, 15h04
  2. GWT <--> Mysql avec Hibernate
    Par tatemilio2 dans le forum GWT et Vaadin
    Réponses: 12
    Dernier message: 23/04/2008, 18h04
  3. [Data] Problème de lazy avec hibernate et Spring
    Par Invité dans le forum Spring
    Réponses: 3
    Dernier message: 20/02/2008, 20h03
  4. Réponses: 2
    Dernier message: 29/01/2007, 15h13
  5. Configurer MYSQL++ avec Dev-C++ pour une connexion à BDMySQL
    Par limouna dans le forum Installation
    Réponses: 1
    Dernier message: 24/07/2005, 21h25

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