精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-10
最后修改:2008-11-10
具体配置如下 <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close"> <property name="driver"> <value>com.mysql.jdbc.Driver</value> </property> <property name="driverUrl"> <value>${jdbc.url}</value> </property> <property name="user"> <value>cap</value> </property> <property name="password"> <value>cap</value> </property> <property name="alias"> <value>dbpool</value> </property> <property name="prototypeCount"> <value>5</value> </property> <property name="maximumConnectionCount"> <value>100</value> </property> <property name="minimumConnectionCount"> <value>10</value> </property> <property name="trace"> <value>true</value> </property> <property name="verbose"> <value>true</value> </property> 情况开始好转,然而好景不长,系统稳定运行了96小时后,开始抛出一下异常: at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) at java.lang.Thread.run(Thread.java:595) 10528328 [http-8080-Processor352] ERROR org.hibernate.transaction.JDBCTransaction - JDBC begin failed com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: Software caused connection abort: socket write error STACKTRACE: java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2744) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3250) at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5395) at sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection.java:162) at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnection.java:87) at $java.io.Serializable$$EnhancerByProxool$$4c8217cb.setAutoCommit(<generated>) at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91) at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353) at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:558) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTra nsactionManager.java:377) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(Transaction AspectSupport.java:263) ** END NESTED EXCEPTION ** Last packet sent to the server was 0 ms ago. at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2759) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3250) at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5395) at sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection.java:162) at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnection.java:87) at $java.io.Serializable$$EnhancerByProxool$$4c8217cb.setAutoCommit(<generated>) at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91) at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353) at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:558) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTra nsactionManager.java:377) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(Transaction AspectSupport.java:263) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at java.lang.Thread.run(Thread.java:595) null null null null null null null null null null null null null null null null null 利用proxool提供的监控工具,几百万个事务全部正常执行,loadrunner的事务也全部正常,没有任何失败和错误的事务,这下我突然间没辙了,tomcat的jvm参数,连接池参数,我全设置过了,也排除了内存泄漏和连接池没释放的情况,我的困惑有下: 1.产生这样的异常还会有哪些原因呢? 2.各位在对项目或者产品进行稳定性测试的时候,真的都做到后台不报出任何异常? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-10
1。 C3P0没有问题, 我做过测试。
2。 我记得MYSQL对连接时间有定义的, 一个连接使用多少时间后, 会被自动的断开。那么, 肯定会有异常抛出来。 看你怎么看这个问题了。 3。 OUTOFMEORY的时候, 把HEAP拿出来, 这个可以使用工具分析。不过, 我还是觉得你的程序有问题。 dbcp问题是很大, 我看到不少BUG报告, 包括我们公司的人员说的。 |
|
返回顶楼 | |
发表时间:2008-11-11
连接池有个检测连接是否可用的SQL语句的配置,你配上那个试试
|
|
返回顶楼 | |
发表时间:2008-11-11
连接被断了,抛出异常是正常的。
问题在于,你的程序中没有处理这种可能出现的异常。 |
|
返回顶楼 | |
发表时间:2008-11-11
多谢各位宝贵意见,目前使用proxool连接池后,情况算是稳定下来了。但对于前面所提的异常问题,还是不太理解。
timerri 写道 连接被断了,抛出异常是正常的。
问题在于,你的程序中没有处理这种可能出现的异常。 我是直接使用spring的hibernateTemplate做相关查询的,没有太复杂的业务逻辑,不知如何在里面捕捉连接中断的异常? timerri 写道 连接池有个检测连接是否可用的SQL语句的配置,你配上那个试试
我咋没找到? timerri 写道 1。 C3P0没有问题, 我做过测试。
2。 我记得MYSQL对连接时间有定义的, 一个连接使用多少时间后, 会被自动的断开。那么, 肯定会有异常抛出来。 看你怎么看这个问题了。 3。 OUTOFMEORY的时候, 把HEAP拿出来, 这个可以使用工具分析。不过, 我还是觉得你的程序有问题。 dbcp问题是很大, 我看到不少BUG报告, 包括我们公司的人员说的。 恩,我看论坛上很多人都在用c3p0,起初也按他们那样配,配上后情况只能说比dbcp强些,不到20小时就出现很多jdbc fails,程序中无非就是些对单表进行查询的逻辑,总共没几行代码,实在想不出来代码本身问题。简单到不好意思贴代码 public interface SampleUserService { Collection<SampleUser> loadRowset(int startIndex, int rowCount); Collection<SampleUser> loadRowset4Condition(int startIndex, int rowCount, QueryForm form, String column, String order); void save(SampleUser samplequickuser) throws RuntimeException; void delete(Long id) throws RuntimeException; SampleUser getSampleQuickUserVO(Long id); void update(SampleUser samplequickuser) throws RuntimeException; Integer getSize(); } public class SampleUserServiceImpl implements SampleUserService { private SampleUserDao sampleUserDao; public void setSampleUserDao(SampleUserDao dao) { // TODO Auto-generated method stub this.sampleUserDao = dao; } public Collection<SampleUser> loadRowset(int startIndex, int rowCount) { return sampleUserDao.loadRowset(startIndex, rowCount); } @SuppressWarnings("unchecked") public Collection<SampleUser> loadRowset4Condition(int startIndex, int rowCount,QueryForm form,String column, String order) { return sampleUserDao.loadRowset4Condition(startIndex, rowCount, form, column, order); } public void delete(Long id) { sampleUserDao.remove(id); } public SampleUser getSampleQuickUserVO(Long id) { return sampleUserDao.get(id); } public void save(SampleUser samplequickuser) { sampleUserDao.save(samplequickuser); } public void update(SampleUser samplequickuser) { sampleUserDao.save(samplequickuser); } public Integer getSize() { return sampleUserDao.getSize(); } } <hibernate-mapping default-cascade="none" auto-import="true" default-lazy="false"> <class name="com.captain.sample.domain.SampleUser" table="sample_user"> <cache usage="nonstrict-read-write"/> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="native" /> </id> <property name="isCheck" type="java.lang.Long"> <column name="ISCHECK" /> </property> <property name="loginPassword" type="java.lang.String"> <column name="LOGIN_PASSWORD" length="50" /> </property> <property name="loginName" type="java.lang.String"> <column name="LOGIN_NAME" length="50" /> </property> <property name="firstName" type="java.lang.String"> <column name="FIRST_NAME" length="100" /> </property> <property name="lastName" type="java.lang.String"> <column name="LAST_NAME" length="100" /> </property> <property name="email" type="java.lang.String"> <column name="EMAIL" length="100" /> </property> <property name="address" type="java.lang.String"> <column name="ADDRESS" /> </property> <property name="phone" type="java.lang.String"> <column name="PHONE" length="32" /> </property> </class> </hibernate-mapping> |
|
返回顶楼 | |
发表时间:2008-11-11
不论你换各种连接池...对于你来说是换汤不换药的. 你应该考虑下cache上的设计..
|
|
返回顶楼 | |
发表时间:2008-11-12
最后修改:2008-11-12
proxool配置文件可以这样配置测试连接sql语句:
<house-keeping-test-sql> select getdate() </house-keeping-test-sql> 连接如果还是不稳定建议lz去掉Hibernate直接用jdbc试一试。 |
|
返回顶楼 | |
发表时间:2008-11-12
楼主能确定 这段测试过程中 网络连接一直畅通么?
是不是因为网络问题会影响稳定性的测试结果? |
|
返回顶楼 | |
发表时间:2008-11-12
这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。
|
|
返回顶楼 | |
发表时间:2008-11-12
dennis_zane 写道 这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。
多谢各位,目前公司测试组决定把这个异常原原本本写进测试报告中,我想确认的就是到底是网络层的异常还是工程配置或者代码的原因。看了各位建议后心里稍微有底了。 |
|
返回顶楼 | |