Hibernate无法打开连接 [英] Hibernate cannot open connection
问题描述
public class MyDao extends HibernateDaoSupport
:
{
DataSource dataSource;
public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
$ b $ public MyPOJO findByQuery(int hour)
{
Query query = this.getSession()。createSQLQuery(
SELECT * FROM MyPOJO WHERE someDate> = DATE_SUB(now(),INTERVAL?HOUR))
.addEntity(MyPOJO.class);
列表< MyPOJO> results = query.setInteger(0,hours).list();
返回结果;
$ p然后在测试用例中调用findByQuery(1) 8次,它的工作原理,但如果我第九次调用它失败:
org.hibernate.exception.GenericJDBCException:Can not在org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)打开的连接
在org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
。在组织.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
在org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
在org.hibernate.jdbc.ConnectionManager.openConnection (ConnectionManager.java:426)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
在org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
在org.hibernate.loader.Loader.do Query(Loader.java:673)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2213)
在org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
在org.hibernate.loader.Loader.list(Loader.java:2099)
在org.hibernate .loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list (AbstractSessionImpl.java:142)
在org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
引起:org.apache.commons.dbcp.SQLNestedException:无法检索连接信息从org.apache.commons.dbcp.datasources.SharedPoolDataSource.getPooledConnectionAndInfo(SharedPoolDataSource.java:169)池
在org.apache.commons.dbcp.datasources.InstanceKeyDataSource.getConnection(InstanceKeyDataSource.java: 631)
在org.apache.commons.dbcp.datasources.I nstanceKeyDataSource.getConnection(InstanceKeyDataSource.java:615)
在org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
在org.hibernate.jdbc.ConnectionManager.openConnection(的ConnectionManager。 java:423)
... 35 more
导致:java.util.NoSuchElementException:超时等待空闲对象
在org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject( GenericKeyedObjectPool.java:827)在org.apache.commons.dbcp.datasources.SharedPoolDataSource.getPooledConnectionAndInfo(SharedPoolDataSource.java:165
)
... 39更
这就是我的hibernate属性的样子:
< property name =hibernateProperties>
<道具>
< prop key =hibernate.dialect>
org.hibernate.dialect.MySQL5Dialect
< / prop>
< prop key =hibernate.current_session_context_class>
线程
< / prop>
< prop key =hibernate.format_sql> false< / prop>
< prop key =hibernate.show_sql> false< / prop>
< prop key =hibernate.use_sql_comments> false< / prop>
< prop key =hibernate.jdbc.use_get_generated_keys> true< / prop>
< prop key =hibernate.cache.use_second_level_cache> true< / prop>
< prop key =hibernate.cache.provider_class>
org.hibernate.cache.EhCacheProvider
< / prop>
< prop key =hibernate.connection.release_mode> auto< / prop>
< /道具>
< / property>
如果我将release_mode更改为'after_statement'(ala http://docs.jboss.org/hibernate/stable/core/reference/en / html_single /#transactions-connection-release )它会起作用,但我不明白这一点,并且觉得这只是一个更大的工具,而我做错了。
我也尝试刷新并关闭this.getSession(),但没有运气。我可以看到close()在所有对findByQuery(1)的调用完成后调用。
这是Hibernate 3.2.6,Spring 3.0和MySQL 5.1 。
springource.org.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/hibernate3/support/HibernateDaoSupport.html#getSession()rel =noreferrer> Javadoc for
让我知道我可以提供什么更多信息。HibernateDaoSupport。 getSession()
表示:
请注意,这并不意味着是
从HibernateTemplate代码
中调用,而只是在纯Hibernate
代码中。或者依赖线程绑定的
Session或与
组合使用releaseSession (org.hibernate.Session)。
因此,通过
getSession()
releaseSession()public MyPOJO findByQuery(int hour)
{
Session s = null;
尝试{
s = this.getSession();
Query query = s.createSQLQuery(
SELECT * FROM MyPOJO WHERE someDate> = DATE_SUB(now(),INTERVAL?HOUR))
.addEntity(MyPOJO.class);
列表< MyPOJO> results = query.setInteger(0,hours).list();
返回结果;
} finally {
if(s!= null)this.releaseSession(s);
$ / code>但是,处理会话的更好方法是使用一个
HibernateCallback
:public MyPOJO findByQuery(int hour)$ b $ 。b {
返回this.getHibernateTemplate()executeFind(新HibernateCallback<列表与LT; MyPOJO>>(){
列表与LT; MyPOJO> doInHibernate(构造org.hibernate.Session会话){
查询query = session.createSQLQuery(
SELECT * FROM MyPOJO WHERE someDate> = DATE_SUB(now(),INTERVAL?HOUR))
.addEntity(MyPOJO.class);
return query .setInteger(0,hours).list();
}
});
}
I'm having trouble with hibernate not able to open a connection. I have a DAO:
public class MyDao extends HibernateDaoSupport { DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public MyPOJO findByQuery(int hour) { Query query = this.getSession().createSQLQuery( "SELECT * FROM MyPOJO WHERE someDate >= DATE_SUB(now(), INTERVAL ? HOUR)") .addEntity(MyPOJO.class); List<MyPOJO> results = query.setInteger(0, hours).list(); return results; } }
and then in a test case call findByQuery(1) 8 times, it works, but if I call a 9th time it fails with:
org.hibernate.exception.GenericJDBCException: Cannot open connection at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426) at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144) at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547) at org.hibernate.loader.Loader.doQuery(Loader.java:673) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2213) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152) Caused by: org.apache.commons.dbcp.SQLNestedException: Could not retrieve connection info from pool at org.apache.commons.dbcp.datasources.SharedPoolDataSource.getPooledConnectionAndInfo(SharedPoolDataSource.java:169) at org.apache.commons.dbcp.datasources.InstanceKeyDataSource.getConnection(InstanceKeyDataSource.java:631) at org.apache.commons.dbcp.datasources.InstanceKeyDataSource.getConnection(InstanceKeyDataSource.java:615) at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423) ... 35 more Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:827) at org.apache.commons.dbcp.datasources.SharedPoolDataSource.getPooledConnectionAndInfo(SharedPoolDataSource.java:165) ... 39 more
This is what my hibernate properties look like:
<property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQL5Dialect </prop> <prop key="hibernate.current_session_context_class"> thread </prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.use_sql_comments">false</prop> <prop key="hibernate.jdbc.use_get_generated_keys">true</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.connection.release_mode">auto</prop> </props> </property>
If I change the release_mode to 'after_statement' (ala http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#transactions-connection-release) it will work, but I don't understand that and feel like that is just a band-aid for something bigger that I am doing wrong.
I've also tried to flush and close the this.getSession() with no luck either. I can see the close() gets called AFTER all of the calls to findByQuery(1) have completed.
This is on Hibernate 3.2.6, Spring 3.0 and MySQL 5.1. Let me know what more information I can provide.
解决方案Javadoc for
HibernateDaoSupport.getSession()
says:Note that this is not meant to be invoked from HibernateTemplate code but rather just in plain Hibernate code. Either rely on a thread-bound Session or use it in combination with releaseSession(org.hibernate.Session).
So, the session obtained via
getSession()
should be released viareleaseSession()
:public MyPOJO findByQuery(int hour) { Session s = null; try { s = this.getSession(); Query query = s.createSQLQuery( "SELECT * FROM MyPOJO WHERE someDate >= DATE_SUB(now(), INTERVAL ? HOUR)") .addEntity(MyPOJO.class); List<MyPOJO> results = query.setInteger(0, hours).list(); return results; } finally { if (s != null) this.releaseSession(s); } }
But the better way to deal with session is to use a
HibernateCallback
:public MyPOJO findByQuery(int hour) { return this.getHibernateTemplate().executeFind(new HibernateCallback<List<MyPOJO>>() { List<MyPOJO> doInHibernate(org.hibernate.Session session) { Query query = session.createSQLQuery( "SELECT * FROM MyPOJO WHERE someDate >= DATE_SUB(now(), INTERVAL ? HOUR)") .addEntity(MyPOJO.class); return query.setInteger(0, hours).list(); } }); }
这篇关于Hibernate无法打开连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!