克服Hibernate 5连接限制

时间:2016-09-15 09:31:40

标签: java hibernate

我正在使用Hibernate作为ORM创建与数据库通信的RESTful服务。

我遇到的问题是Hibernate的连接池限制,只要我达到限制就会抛出异常。

Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available!

1)我试图在hibernate.cfg.xml

中设置最大池大小
<property name="connection.pool_size">10</property>

2)我尝试过每次都打开一个新的Session,获取当前的连接

public static Session getCurrentSession(){
        try{
            return sessionFactory.getCurrentSession();
        }
        catch(Exception e){
            try {
                return sessionFactory.openSession();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
 }

我最终总是到达limit

有没有办法完全克服这个问题?

2 个答案:

答案 0 :(得分:1)

  

2)我曾尝试过,而不是每次都开一个新的会议,......

我认为在您通常的代码中,您可以像这样打开会话:

Session session = sessionFactory.openSession();

您报告的Exception通常在您关闭会话时发生。但是,即使您似乎已关闭了session,但有可能发生某些异常,但不允许控件达到session.close()语句。

Session session = sessionFactory.openSession();
statement1;
statement2; //      <-- Exception occurs here
statement3;
session.close();//  <-- because of above Exception, your control never reaches here.

因此,在这种情况下的最佳做法是将session.close()写在这样的finally块中。

Session session;
try {    
    session = sessionFactory.openSession();
    statement1;
    statement2; //       <-- Exception occurs here
    statement3;
}
finally {
    session.close();//   <-- although there's an exception above, your control won't leave without executing this statement.
}

如果您使用的是Java 7及更高版本,那么您也可以使用try with resourcesoracle doc

try (Session session = sessionFactory.openSession()) {
    statement1;
    statement2;
    statement3;
}

答案 1 :(得分:0)

我没有发现对hibernate连接池没有限制。但是,从这个答案:Hibernate config connection pool size

你不应该使用hibernate的池化机制,因为它不适合生产(你可以看到......)。您可能想要使用像c3p0或hikariCP这样的池化API(我听说DBCP很老了)。

c3p0有一个“c3p0.minPoolSize”参数,但没有强制的最大大小,因此它会根据需要增长。如果你使用spring和maven,很容易与hibernate(http://www.mchange.com/projects/c3p0/https://www.mkyong.com/hibernate/how-to-configure-the-c3p0-connection-pool-in-hibernate/集成)

但是,对于您当前的配置,如果应用程序崩溃之前您的最大连接数没有最大限制,则可能存在泄漏(请检查您是否关闭了所有连接)。