数据库连接池爆满异常(顶者送分)
当我多次刷新页面,或者在页面间来回跳转个几次,(也就是多次访问数据库了),就出现这异常,mysql数据库
exception
javax.servlet.ServletException: org.hibernate.exception.GenericJDBCException: Cannot open connection
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
root cause
java.sql.SQLException: Couldn't get connection because we are at maximum connection count (10/10) and there are none available
org.logicalcobwebs.proxool.Prototyper.quickRefuse(Prototyper.java:309)
org.logicalcobwebs.proxool.ConnectionPool.getConnection(ConnectionPool.java:158)
org.logicalcobwebs.proxool.ProxoolDataSource.getConnection(ProxoolDataSource.java:97)
org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
说已经超过最大连接数10个,可是很奇怪我同样代码在家都OK,在公司怎么就出现这异常,(在公司数据库是连的一台服务器192.168.1.229)
因为spring 管理的那个sessionFactory,我是直接自己写的BaseDAO,被用于其他的DAO继承,来获取连接,
以下是我的applicationContext.xml,红色部分是我的BaseDao,我没有配置事务,老大是在服务层配置的事务,我是在DAO层操作,不一定得配置事务才行啊
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="${proxool.driver}" />
<property name="driverUrl" value="${proxool.url}" />
<property name="user" value="${proxool.username}" />
<property name="password" value="${proxool.password}" />
<property name="alias" value="${proxool.alias}" />
<property name="houseKeepingSleepTime" value="${proxool.houseKeepingSleepTime}" />
<property name="prototypeCount" value="${proxool.prototypeCount}" />
<property name="maximumConnectionCount" value="${proxool.maximumConnectionCount}" />
<property name="minimumConnectionCount" value="${proxool.minimumConnectionCount}" />
<property name="trace" value="${proxool.trace}" />
<property name="verbose" value="${proxool.verbose}" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!--Hibernate SessionFatory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>com/goodstart/core/security/model/hbm/Resource.hbm.xml</value>
<value>com/goodstart/core/security/model/hbm/Role.hbm.xml</value>
<value>com/goodstart/core/security/model/hbm/User.hbm.xml</value>
<value>com/goodstart/core/security/model/hbm/Department.hbm.xml</value>
<value>com/goodstart/oa/casemanager/vo/Casetype.hbm.xml</value>
<value>com/goodstart/oa/casemanager/vo/Tcase.hbm.xml</value>
<value>com/goodstart/oa/casemanager/vo/CaseAttach.hbm.xml</value>
<value>com/goodstart/oa/casemanager/vo/CaseDpm.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${proxool.dialect}</prop>
<prop key="hibernate.show_sql">${proxool.show_sql}</prop>
<prop key="hibernate.cache.use_query_cache">${proxool.cache.use_query_cache}</prop>
<prop key="hibernate.cache.provider_class">${proxool.cache.provider_class}</prop>
<!--
<prop key="hibernate.hbm2ddl.auto">update</prop>
-->
</props>
</property>
</bean>
<!-- BaseDAO -->
<bean id="baseDAO" class="com.goodstart.oa.casemanager.factory.BaseDAO" abstract="true">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!--Hibernate TransactionManager-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--Base TransactionProxyed Service Bean-->
<bean id="baseTxService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="proxyTargetClass" value="true" />
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- EhCache Manager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation">
<value>classpath:ehcache.xml</value>
</property>
</bean>
<import resource="classpath:com/goodstart/admin/applicationContext-ext.xml" />
<import resource="classpath:com/goodstart/core/security/applicationContext-security.xml" />
<import resource="classpath:com/goodstart/oa/casemanager/applicationContext-casemanager.xml"/>
</beans>
由于内容过长,接下条
[解决办法]
SF
[解决办法]
[解决办法]
20帮你顶
[解决办法]
顶起来!
[解决办法]
是MYsql连接数满了吧,建议用连接池
[解决办法]
hibernate的session在哪打开和关闭的??
[解决办法]
应该是没有及时释放吧
[解决办法]
hibernate使用proxool连接池
<session-factory>
<!-- proxool连接池加载的类-->
<property name="hibernate.connection.provider_class">
org.hibernate.connection.ProxoolConnectionProvider
</property>
<!--连接池的别名,即配置连接池时起的别名-->
<property name="hibernate.proxool.pool_alias">
xml-test
</property>
<!--连接池文件的地址-->
<property name="hibernate.proxool.xml">
config/proxool/proxool.xml
</property>
<!--是否将运行期生成的SQL输出到日志以供调试-->
<property name="show_sql">true</property>
<mapping resource="com/jack/ssh/demo/bo/City.hbm.xml" />
<mapping resource="com/jack/ssh/demo/bo/Province.hbm.xml" />
</session-factory>
proxool.xml
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
<proxool>
<alias>xml-test</alias>
<driver-url>jdbc:oracle:thin:@localhost:1521:oracle</driver-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-properties>
<property name="user" value="lixiaoyan"/>
<property name="password" value="lxy"/>
</driver-properties>
<maximum-connection-count>10</maximum-connection-count>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
</something-else-entirely>
[解决办法]
顶
[解决办法]
<bean id="mainDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
[解决办法]
无他
唯顶
[解决办法]
你自己写了baseDao,自然就不用spring 管理事务了,你老大既然都在spring配置了sessionFactory,你只需要在每个dao里ref按名字引用一下就行了
再就是你spring配置dao写的真不规范,接口你没必要配置上,业务层调用的时候其实真正用的还是实现类,实现接口是为了实现动态代理
[解决办法]
<bean id="youDao" class="com.dao.yourDaoImpl" > <property name="sessionFactory" ref="sessionFctory"/> </bean>
[解决办法]
public void update(Tcase tcase) throws Exception {
Session session = getSession();
session.update(tcase);
session.beginTransaction().commit();
session.close();
}
类是这一块的上面的所有的 .close();
最好都放在finally里面去关闭,因为你用的session对象是你在具体方法里面里生成局部变量,在这方法里面虽然你 .close(); 了。如果执行相应很顺利,session对象可以关闭,但是如果你页面的请求改变过于频繁,session.close()可能还没有执行,就被新的请求的原因而中断,这样就用以造成死锁,连接关闭不了了等!
finally{ if(session!=null){ session.close(); }}
[解决办法]
在DAO中使用getHibernateTemplate().*时,spring会自动管理session(包括connection),
而强制使用getSession()时Spring是不管理session的,配了事务也没用[align=left][/align]
[解决办法]
关注~
[解决办法]
up
[解决办法]
up
[解决办法]
建议由spring去管理session关闭,即在dao中通过模板去操作,这样在进行声明式事务管理时也比较方便
[解决办法]
mark
[解决办法]
楼主,你的代码太多,看不过来了,所以没办法帮你找问题。
给你讲讲我如果碰到类似情况会怎么做吧,对你也许有些帮助。
明确目标--找到连接池不能及时释放的原因
明确可能发生问题的地点--DAO\SERVICE\事务
布置隔离的测试环境,目标一定要对准。
写测试代码
我会先针对DAO写测试代码,把你在页面跳来跳去可能执行的DAO用代码mock一下
如果没问题,就再写代码测service
最终会找到问题所在的
碰到这样的问题,一定要化繁为简,一步一步来,肯定会有答案的。
[解决办法]
你是只改了一个还是全部都改可了 你不要嫌麻烦全部都改了试试。
<!-- 此处的id名一定要与Action中依赖注入定义的属性一致 -->
<bean id="casetypeServiceImpl" class="com.goodstart.oa.casemanager.service.impl.CaseTypeServiceImpl"> <property name="casetypeDAOImpl"> <ref bean="casetypeDAOImpl" /> </property> </bean> <bean id="tcaseServiceImpl" class="com.goodstart.oa.casemanager.service.impl.TcaseServiceImpl"> <property name="tcaseDAOImpl"> <ref bean="tcaseDAOImpl" /> </property> </bean> <bean id="caseattachServiceImpl" class="com.goodstart.oa.casemanager.service.impl.CaseAttachServiceImpl"> <property name="caseattachDAOImpl"> <ref bean="caseattachDAOImpl" /> </property> </bean> <bean id="casedempServiceImpl" class="com.goodstart.oa.casemanager.service.impl.CaseDempServiceImpl"> <property name="casedempDAOImpl"> <ref bean="casedempDAOImpl" /> </property> </bean>
[解决办法]
尝试用以下方式来关闭:
public static void closeSession()throws HibernateException{
Session s = (Session)session.get();
session.set(null);
if(s!=null && s.isOpen() ){
s.close();
}
}
[解决办法]
顶下
[解决办法]
アップ
[解决办法]
顶下
[解决办法]
~ ~
顶
[解决办法]
在你的BaseDAO类加上close方法看看行不行。
public void close(){sessionFactory.close();}或者在子类里面使用sessionFactory.close();
[解决办法]
[解决办法]
mark
[解决办法]
晕啊,看晕了
[解决办法]
帮顶吧
[解决办法]
有人提过这个mysql的bug不过他们的开发人员一直没有处理,你可以看一下, session.close()不一定真正的关闭了connection.
http://bugs.mysql.com/bug.php?id=10917
session.close()不是必需的,session.disconnect()才是真正的释放连接。
[解决办法]
幫你頂!
[解决办法]
顶一下!!
[解决办法]
我可是为分而顶啊
[解决办法]
up
[解决办法]
mark!
[解决办法]
既然用spring管理事务,不用getHibernateTemplate()?
[解决办法]
顶
[解决办法]
SF
[解决办法]
帮顶,刚学连接池,还不会解决楼主的问题
[解决办法]
帮你顶
[解决办法]
这样的问题论坛中,天天都有人问
[解决办法]
ding
[解决办法]
哇!顶