6
votes

Trop de connexions utilisant Hibernate et MySQL

J'utilise Hibernate 3 et MySQL Sever 5.5 pour une application myweb avec Spring 3.0

Je reçois une exception comme trop de connexions ......

Mon fichier Java où je crée une session est Comme suit: xxx

et j'appelle cette méthode où j'ai besoin de session

comme xxx

et après xxx

i session en utilisant xxx

aidez-moi s'il vous plaît à résoudre le problème .......

mon hibernate.cfg.xml est: xxx


1 commentaires

Avant d'appeler session.close () appel session.flush . Il semble que vos connexions ne soient pas retournées à la piscine après utilisation.


5 Réponses :


-2
votes

Java Issue h2>

Vérifiez cette réponse: https://stackoverflow.com/a/10785770/598424 h3>

problème mysql strong> p>

Vous devez vous connecter en tant que superutilisateur. Ensuite, exécutez ce code: p> xxx pré>

Cependant, cela ne dure que jusqu'à ce que le serveur MySQL redémarre. Si vous souhaitez le modifier de façon permanente, vous pouvez ajouter les éléments suivants comme dans la section MySQLD. P>

 kill 2309344;


4 commentaires

Merci pour la réponse, mais connaissez-vous une solution du côté Java?


Ce n'est pas un problème avec Java. C'est un problème avec MySQL.


C'est une question Java, la sessionFactory est recréée à chaque fois. L'amour La réponse de Hasija explique tout.


Ce n'est pas du tout une réponse recommandée.



5
votes

Vous créez de nouveaux SéanceFactory code> S Chaque fois que vous avez besoin d'une session code> code> et de ne pas les fermer.

Habituellement, vous devez créer une session usine une seule fois lors du démarrage de votre application et fermez-la pendant l'arrêt. Par exemple, comme suit: P>

public class DBConnection {
    private static SessionFactory factory;
    static {
        factory = new Configuration().configure().buildSessionFactory();
    }

    public Session getSession() {
        return factory.openSession();
    }

    // Call this during shutdown
    public static void close() {
        factory.close();
    }
}


1 commentaires

@LaxMikantkumbHare: lorsque vous éteignez toute l'application, par exemple. dans servleContextListener.contextDestroyed () .



26
votes

En effet, vous utilisez un pool de connexion qui a été créé dès que vous construisez SéanceFactory, mais les connexions ne sont acquises que lorsque vous ouvrez une session. Maintenant, vous fermez la session, en raison de laquelle les connexions sont libérées, mais ne sont pas fermées et sont retenues au bord de la piscine. Maintenant, vous créez à nouveau une sessionFactory, créant ainsi une nouvelle piscine, puis obtenir une session, créant ainsi une nouvelle connexion et ainsi de suite .. qui finira par atteindre le nombre maximum de connexions autorisées.

Ce que vous avez à faire est Utilisation d'un pool de connexion (en utilisant une sessionFactory) et d'obtenir et de libérer les connexions du même pool. P>

public class DBConnection {

      private static SessionFactory factory;
      static {
            factory = new Configuration().configure().buildSessionFactory();
      }

      public Session getSession() {
            return factory.openSession();
      }

      public void doWork() {
           Session session = getSession();
           // do work.
           session.close();
      }

     // Call this during shutdown
     public static void close() {
          factory.close();
     }
}


1 commentaires

Besoin d'un conseil. Qu'en est-il quand il va à des servlets? Ils sont multi-filetés, de sorte que cette façon l'affecte-t-elle?



1
votes

J'ai utilisé

mysql> show processlist;


0 commentaires

1
votes

Je faisais face aux mêmes problèmes avec Hibernate MySQL Conenrtions Les deux choses suivantes ont aidé à corriger mes problèmes de connexion xxx

créer une classe Singleton pour obtenir une dbconnection

N'oubliez pas de jouer session.close () lorsque votre requête est complète

aussi dans "hibernate.cfg.xml" Ajoutez cette ligne

.... 100 ....

sous


0 commentaires