Hibernate无法打开连接 [英] Hibernate cannot open connection

查看:135
本文介绍了Hibernate无法打开连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了无法打开连接的问题。我有一个DAO:

  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 via releaseSession():

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆