论坛首页 Java企业应用论坛

小小困惑:各位在公司都是如何做稳定性测试的?

浏览 20468 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-10   最后修改:2008-11-10
  公司产品在做验收,压力、负载测试全部通过了,目前在做稳定性测试,计划是让200人(分属不同的用户组,做不同的操作)负载不间断运行200小时,产品用的是公司内部的标签库+spring2.5+struts1.2.9+hibernate3.3,ehcache作为二级查询缓存,默认使用apache的dbcp连接池,但经测试后十分不稳定,换c3p0后效果好些,但是运行20小时左右就持续抛出jdbc fails等异常,接着出现out of memory。。。最后无奈把连接池切换到proxool,
具体配置如下
	 <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.各位在对项目或者产品进行稳定性测试的时候,真的都做到后台不报出任何异常?
   发表时间:2008-11-10  
1。 C3P0没有问题, 我做过测试。
2。 我记得MYSQL对连接时间有定义的, 一个连接使用多少时间后, 会被自动的断开。那么, 肯定会有异常抛出来。  看你怎么看这个问题了。
3。 OUTOFMEORY的时候, 把HEAP拿出来, 这个可以使用工具分析。不过, 我还是觉得你的程序有问题。 dbcp问题是很大, 我看到不少BUG报告, 包括我们公司的人员说的。
0 请登录后投票
   发表时间:2008-11-11  
连接池有个检测连接是否可用的SQL语句的配置,你配上那个试试
0 请登录后投票
   发表时间:2008-11-11  
连接被断了,抛出异常是正常的。

问题在于,你的程序中没有处理这种可能出现的异常。
0 请登录后投票
   发表时间: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>
0 请登录后投票
   发表时间:2008-11-11  
不论你换各种连接池...对于你来说是换汤不换药的. 你应该考虑下cache上的设计..
0 请登录后投票
   发表时间:2008-11-12   最后修改:2008-11-12
proxool配置文件可以这样配置测试连接sql语句:
<house-keeping-test-sql>
select getdate()
</house-keeping-test-sql>

连接如果还是不稳定建议lz去掉Hibernate直接用jdbc试一试。
1 请登录后投票
   发表时间:2008-11-12  
楼主能确定 这段测试过程中 网络连接一直畅通么?

是不是因为网络问题会影响稳定性的测试结果?
0 请登录后投票
   发表时间:2008-11-12  
这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。
0 请登录后投票
   发表时间:2008-11-12  
dennis_zane 写道
这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。


多谢各位,目前公司测试组决定把这个异常原原本本写进测试报告中,我想确认的就是到底是网络层的异常还是工程配置或者代码的原因。看了各位建议后心里稍微有底了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics