使用Hibernate和mysql的连接太多

Lax*_*are 6 mysql hibernate

我正在使用Hibernate 3和mysql sever 5.5 for myweb application with spring 3.0

由于太多关系,我得到例外......

我创建会话的java文件如下:

public class DBConnection {

    static{

    }

    public Session getSession(){

         Session session = null;
         SessionFactory sessionFactory= null;
         sessionFactory = new Configuration().configure().buildSessionFactory();
        session = sessionFactory.openSession();
        return session;

    }

}
Run Code Online (Sandbox Code Playgroud)

我在需要会话的地方调用这个方法

Session session=new DBConnection().getSession();
Run Code Online (Sandbox Code Playgroud)

之后

transaction.commit();
Run Code Online (Sandbox Code Playgroud)

我通过使用关闭会话

session.close();
Run Code Online (Sandbox Code Playgroud)

请帮我解决问题.......

我的hibernate.cfg.xml是:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/dbname</property>
<property name="hibernate.connection.username">root</property>

  <property name="hibernate.connection.password">lax</property>
  <property name="hibernate.connection.pool_size">100</property>
  <property name="show_sql">true</property>
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="hibernate.hbm2ddl.auto">update</property>
  <property name=""></property>

  <property name="hibernate.connection.release_mode">on_close</property>

</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)

Lov*_*ija 24

这是因为您使用的是在构建SessionFactory时立即创建的连接池,但只有在您打开Session时才会获取连接.现在,您正在关闭会话,因为会话已释放,但未关闭并由池保留.现在,您再次创建一个SessionFactory,从而创建一个新池,然后获取一个会话,从而创建一个新的连接等等......最终将达到允许的最大连接数.

您需要做的是使用一个连接池(使用一个SessionFactory)并从同一个池获取和释放连接.

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();
     }
}
Run Code Online (Sandbox Code Playgroud)


axt*_*avt 5

SessionFactory每次需要 a 时都会创建新的sSession并且不要关闭它们。

通常您只需要在应用程序启动期间创建一次会话工厂,并在关闭期间关闭它。例如,如下:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

另请查看上下文会话模式