我正在使用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
。
有没有办法完全克服这个问题?
答案 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 resources
。 oracle 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/集成)
但是,对于您当前的配置,如果应用程序崩溃之前您的最大连接数没有最大限制,则可能存在泄漏(请检查您是否关闭了所有连接)。