`
yshao81710
  • 浏览: 94063 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ssh 不能释放tomcat数据库连接池中的连接

阅读更多

在Spring+hebernate中 Cannot get a connection, pool error Timeout waiting for idle object异常的解决办法
   最近写了个留言板,tomcat+Spring+hibernate+MyEclipse
   使用jdbc连接数据库所有功能都没问题,发布到tomcat中也没问题,可是如果使用tomcat的数据源,来连接数据库,开始很正常,但是刷新几次就会出现这个异常……2008-04-26 22:35:40,812 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null
2008-04-26 22:35:40,812 ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object
2008-04-26 22:35:40,812 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null
2008-04-26 22:35:40,812 ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object
2008-04-26 22:35:40,812 ERROR [com.dao.MessageDAO] - find all failed
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
Caused by:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
    at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection (LocalDataSourceConnectionProvider.java:81)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:105)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
    at org.hibernate.loader.Loader.doQuery(Loader.java:661)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.doList(Loader.java:2145)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
    at org.hibernate.loader.Loader.list(Loader.java:2024)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:832)
……………………
开始弄了半天也不知道怎么回事,后来发现是我自己写的分页代码有问题……原来的代码如下:
/**
    * 自定义的,用属性模糊查询
    *
    * */
    public List find(String propertyName, Object value) {
        log.debug("finding Message instance with property: " + propertyName
              + ", value: " + value);
        try {
           String queryString = "from Message as model where model."
                                   + propertyName + " like "+value+" order by model.time desc";         
        return getHibernateTemplate().find(queryString);
        } catch (RuntimeException re) {
           log.error("find by property name failed", re);
           throw re;
        }
    }


    /**
     *
     * 自定义的方法,获取指定页的数据
     *
     * */
    public List gotoPage(int page,int pageSize){

        int totItem = this.findAll().size();//记录总条数
        int pageNum = totItem / pageSize +1;//总页数
        int begin = 0;//当前起始记录数

        begin=page*pageSize-pageSize+1; //计算当前起始位置

        Session s =this.getSession();
        String hql = "from Message message order by message.time desc";
        Query q =s.createQuery(hql);
        q.setFirstResult(begin);
        q.setMaxResults(pageSize);      
        return q.list();
    }
在这句中: Session s =this.getSession();
        String hql = "from Message message order by message.time desc";
        Query q =s.createQuery(hql);
   查询数据时,Spring并不能够自动管理连接,也就是说,在使用中这几句代码重视不段的获取数据库的连接,每调用一次就申请一个连接……直到 tomcat连接池中的连接耗尽……所以就再也申请不到连接了……出现了这个异常,解决办法是使用事务来管理这段代码,让Spring自动管理这段代码中申请的连接。我使用了Spring AOP自动事务代理……配置文件如下……
<!-- 来自JNDI的tomcat数据源,有连接池。但是用起来怎么就释放不了连接呢?程序只知道申请,不知道释放! -->
    <bean id="JndiDataSource"
        class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <value>java:comp/env/SqlServer</value>
        </property>
        <property name="resourceRef">
            <value>true</value>
        </property>
    </bean>
    <!-- hibernate的会话工厂 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="JndiDataSource"></ref>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.SQLServerDialect
                </prop>
                <!-- 显示SQL,为了方便测试 -->
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list><!-- 映射文件 -->
                <value>./Message.hbm.xml</value>
                <value>./Setting.hbm.xml</value>
                <value>./Admin.hbm.xml</value>
            </list>
        </property>
    </bean>
    <!-- 事务管理器 -->
    <bean id="transactionManger"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <!--   配置事务拦截器-->
    <bean id="transactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager">
            <ref bean="transactionManger" />
        </property>
        <!--   下面定义事务传播属性-->
        <property name="transactionAttributes">
            <props>
                <prop key="find*">PROPAGATION_REQUIRED</prop>
                <prop key="delete*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="merge*">PROPAGATION_REQUIRED</prop>
                <prop key="attach*">PROPAGATION_REQUIRED</prop>               
                <prop key="gotoPage">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
    <!-- 自动代理 -->
    <bean id="autoBeanNameProxyCreator"
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>*DAO</value>              
                <value>gotoPage</value>
              <value>find</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <idref local="transactionInterceptor" />
            </list>
        </property>

        <!-- 这里的配置是必须的,否则无法完成代理的类型转化
        这是使用CGLIB来生成代理
        -->
        <property name="proxyTargetClass" value="true"/>
    </bean>
    <bean id="MessageDAO" class="com.dao.MessageDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory"></ref>
        </property>
    </bean>
    <bean id="SettingDAO" class="com.dao.SettingDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory"></ref>
        </property>
    </bean>
    <bean id="AdminDAO" class="com.dao.AdminDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory"></ref>
        </property>
    </bean>
</beans>

OK,问题成功解决!

分享到:
评论

相关推荐

    tomcat中连接池配置

    本文将详细解释如何在Tomcat中配置数据连接池,并探讨`context.xml`和`web.xml`中的配置信息。 首先,数据连接池允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接,从而显著提高了系统效率...

    SSH+MySql demo 数据库自动创建

    在数据库自动创建中,Spring可以用来管理数据库连接池,如C3P0或HikariCP,以及事务管理,确保数据操作的原子性和一致性。 3. **Hibernate**:Hibernate是ORM(对象关系映射)工具,它简化了Java应用与数据库之间的...

    SSH+oracle所需全部包

    在整合这三个框架时,还需要一些其他的支持库,例如`commons-dbcp`或`tomcat-jdbc`提供数据库连接池,提高数据库连接的效率和管理。`log4j`或`slf4j`用于日志记录,方便调试和问题排查。`servlet-api`和`jsp-api`是...

    我的学习资料(JAVA的框架,JSP,数据连接池配置,SSH等)

    数据库连接池在Java应用中扮演着关键角色,它管理数据库连接,提高了性能和资源利用率。常见的连接池有Apache的DBCP、C3P0,还有HikariCP等。它们允许开发者在需要时获取连接,用完后归还,而不是每次都创建新的连接...

    SSH + AJAX + TOMCAT + MYSQL + 新手上路 + 详细图文 LIB 1

    2. **c3p0-0.9.1.jar**:C3P0是一个JDBC连接池,提供数据库连接的管理和优化。 3. **commons-**系列库:Apache Commons是包含各种实用工具类的项目,如collections、beanutils和digester,它们简化了Java开发中的...

    struts-hibernate-sprint开发详解 乱码问题 连接池

    为了解决连接池问题,需要引入Apache Commons DBCP和Pool库,它们提供数据库连接池功能。这两个JAR包(`commons-pool-1.4.jar`和`commons-dbcp-1.2.2.jar`)应添加到项目的`lib`目录,以避免XML解析时找不到类的错误...

    SSH框架的优化

    综上所述,SSH框架的优化涉及到数据源的管理、数据库连接池的使用、注解的引入以简化配置、自动装配的合理运用以及配置文件的拆分,这些改进都能提高项目的可维护性和开发效率。对于初学者来说,理解并实践这些优化...

    SSH架构的学生管理系统(附带数据库)

    7. **性能优化**:SSH架构可以通过缓存策略、数据库连接池、批量操作等方式提高系统性能。例如,Hibernate支持二级缓存,Spring可以帮助管理数据库连接池,以减少数据库访问压力。 8. **测试与部署**:在开发完成后...

    SSH架构搭建,SSH架构,

    2. **下载依赖包**:SSH架构需要一系列的jar包,如commons-pool-1.4.jar(用于数据库连接池)、mysql-connector-java-5.0.8-bin.jar(MySQL驱动)等,这些需要提前下载并导入到项目的lib目录下。 3. **创建数据库**...

    【毕业设计】SSH框架实战项目——在线商品拍卖网(源码+数据库).zip

    【毕业设计】SSH框架实战项目...Struts2+Spring+Hibernate+MySQL5.x+proxool数据库连接池 (3)主要功能: 用户:注册,登录,修改密码,注销 商品:添加新商品,查看在拍商品,出价 出价记录:提交出价记录,成交

    SSH框架搭建 ssh的配置文件

    - 将项目部署到Tomcat服务器,启动服务器,通过浏览器访问项目,进行功能测试,确保SSH框架搭建成功并能正常运行。 以上步骤详细介绍了SSH框架的搭建过程,涉及了环境配置、依赖包添加、代码编写及部署测试等多个...

    SSH - SpringMVC4 + Spring4 + Hibernate4 + c3p0 + Mysql.zip

    在本项目"SSH - SpringMVC4 + Spring4 + Hibernate4 + c3p0 + Mysql.zip"中,开发者使用了SpringMVC4作为表现层,Spring4作为控制层和服务层,Hibernate4作为持久层,c3p0作为数据库连接池,以及MySQL作为数据库。...

    ssh常用Jar包

    - `commons-dbcp.jar`或`tomcat-jdbc.jar`提供连接池服务,提高数据库连接的效率和资源管理。 5. 视频处理: - 如果包含视频处理相关的Jar包,可能是为了支持视频上传、预览、转换等功能。例如,`ffmpeg.jar`这样...

    SSH架构性能优化方案

    - 数据库连接池:使用成熟的连接池如C3P0或HikariCP,以有效管理和复用数据库连接。 3. **减少内存消耗**: - 使用StringBuilder或StringBuffer而非String进行字符串拼接,尤其是在循环中。 - 避免无必要的对象...

    基于Java web SSH框架的博客系统( 源码+数据库).zip

    Java EE提供服务器端组件模型,支持事务管理、安全性、资源连接池等功能,使得开发者能够构建更复杂的应用系统。 【数据库】 在本项目中,数据库用于存储博客系统的各种信息,如用户数据、文章内容、评论等。通过...

    mysql+jsp+SSH网站开发中文乱码解决方案

    9. **数据库连接池配置**: 如果使用了连接池,如C3P0、DBCP或HikariCP,也需要在配置文件中指定编码。 10. **前端HTML编码**: 前端HTML页面也需要设置正确的编码,比如`&lt;meta charset="UTF-8"&gt;`,确保浏览器...

    商城网站实例源代码ssh2框架

    8. **部署与优化**:最后,了解如何在Tomcat或其他Servlet容器中部署这个商城网站,以及如何通过调整配置文件进行性能优化,如数据库连接池设置、缓存策略等,也是项目开发中的重要环节。 通过这个实例,初学者可以...

    ssh固定配置文件.rar

    4. **数据库连接池配置**(如c3p0或druid的配置):在SSH项目中,数据库连接池管理数据库连接,提高性能。固定配置文件可能包含连接池的初始化大小、最大连接数、超时时间等参数。 5. **日志配置**(log4j....

    myeclipse创建ssh框架

    1. **Spring**:这是一个全面的后端应用框架,提供了依赖注入(DI)和面向切面编程(AOP)功能,同时也管理着其他组件如数据库连接池、事务管理等。 2. **Struts**:是MVC(Model-View-Controller)设计模式的实现,...

Global site tag (gtag.js) - Google Analytics