请教一下,项目中使用spring+hibernate+struts,有个比较复杂的查询用了jdbc,网上很多资料都是说最后不用关闭连接,但是经过测试循环一百次就报错了,无法再创建数据库连接,请问到底为什么

解决方案 »

  1.   

    jdbc还是JdbcTemplate,若是后者是不需要的
      

  2.   

    是不是DBCP连接池的最大连接配小了。
      

  3.   

    我的applicationContext.xml数据源配置如下:
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
    <value>jdbc:mysql://192.168.34.19:3306/TFKSys</value>
    </property>
    <property name="username">
    <value>teamu</value>
    </property>
    <property name="password">
    <value>1111</value>
    </property>
    <property name="initialSize">
    <value>10</value>
    </property>
    <property name="maxActive">
    <value>100</value>
    </property>
    <property name="maxIdle">
    <value>10</value>
    </property>
    <property name="maxWait">
    <value>1000</value>
    </property> <property name="testWhileIdle">
    <value>true</value>
    </property>
    <property name="removeAbandoned" value="true"/> 
            <property name="removeAbandonedTimeout" value="120"/> 

    </bean>
    我觉得最大连接100个很正常不算小了,mysql连接到达135个左右就报too many connection错误了。我让程序执行一百次jdbc查询,刚好循环到100的时候就报错了,说无法获取connection,基本可以确定通过getSession().connection()获取的connection如果不使用connection.close()的话就释放不了,而且还要session.close(),如果是在HibernateCallback里面是不需要的,但是如果通过connection.close()强制执行关闭的话,那用数据连接池干嘛,所以想请教下在这种情况下connection应该怎么处理,在HibernateCallback里面到底hibernate有没执行connection.close()操作,谢谢。
      

  4.   

    是的,很操蛋,我直接不用DBCP了,要不你就把这种查询全部弄成批处理在代码上加以控制,我觉得只要机子配置还不错,不需要什么数据源。
      

  5.   

    既然不释放,那就在dbcp里配置一下
    加上这几个参数
    removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" 
    会自动释放没有关闭的活动链接
      

  6.   

    既然是要用JDBC那就不用HIBERNATE JPA啊,使用SPRING的JdbcTemplate,SPRING会为你处理获得连接和释放连接的