`
captain
  • 浏览: 135188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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

阅读更多
  公司产品在做验收,压力、负载测试全部通过了,目前在做稳定性测试,计划是让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.各位在对项目或者产品进行稳定性测试的时候,真的都做到后台不报出任何异常?
分享到:
评论
25 楼 everlasting_188 2008-11-14  
wzbwambition 写道
靠,都是二啊,proxool的自动释放连接配置,没有配置!

不一定是配置的问题,只能说设置测试一下,有些是程序自己的问题。极端的例子:写了个死循环,说操作系统设计有问题,不管怎样配置操作系统,还是死循环,具体问题具体分析。
24 楼 ryuluck 2008-11-14  
mysql默认8小时内,无数据连接就会断开连接的,所以出现了连接中断的错误
23 楼 wzbwambition 2008-11-13  
  在dataAccessContext-hibernate.xml 文件中加

    <prop key="hibernate.connection.release_mode">auto</prop>

    <prop key="hibernate.connection.autocommit">true</prop>

 
22 楼 wzbwambition 2008-11-13  
靠,都是二啊,proxool的自动释放连接配置,没有配置!
21 楼 85249551 2008-11-13  
连接断了的话,可以弄个程序再次连接
20 楼 high_java 2008-11-13  
fight_bird 写道
dbcp还是很不错的,楼主不用怀疑连接池的问题,流行的几个都很稳定,如c3p0、dbcp,到目前为止,我还未发现谁比谁更稳定的确实证据,在可控的层面,dbcp更灵活。

顺便给楼主一点信心:一个电子交易项目,基于Oracle + dbcp + Tomcat6,每小时约6000笔交易,服务器端还是在2003 server上,工作时间8小时不间断交易,从无数据库连接问题,年初曾经3个月未重启过。

没有坐过稳定性测试,不过看了各位的评论,就当学习了
19 楼 fight_bird 2008-11-13  
dbcp还是很不错的,楼主不用怀疑连接池的问题,流行的几个都很稳定,如c3p0、dbcp,到目前为止,我还未发现谁比谁更稳定的确实证据,在可控的层面,dbcp更灵活。

顺便给楼主一点信心:一个电子交易项目,基于Oracle + dbcp + Tomcat6,每小时约6000笔交易,服务器端还是在2003 server上,工作时间8小时不间断交易,从无数据库连接问题,年初曾经3个月未重启过。
18 楼 RyanPoy 2008-11-13  
我没有仔细看楼住的错误信息。反正我以前出现过类似的问题。后来找到原因是因为配置文件中maxPoolSize和minPoolSize的值设置过大。当时没有什么经验,想当然的是越大越好。结果刚开始的时候正常,后来就不行了。后来修改后就一直正常了。具体的原因我没有深入研究,我想连接池的设置不仅仅只是设置而已,应该同数据库本身的一些设置紧密相关,因为数据库本身就有最大连接数等等属性的设置。

17 楼 天下有鹏 2008-11-13  
liuzongan 写道
这是可以数据库连接断了造成的,在mysql中默认连接时间为8小时,如果八小时之内没有访问程序,连接将会断开,造成jdbc fail,你可以设置mysql中my.ini或my.cnf(linux)下的

问题可能不会像您说的这样,楼主是不停的做数据库操作.因为不会造成连接池中的连接长时间闲置。
16 楼 liuzongan 2008-11-13  
这是可以数据库连接断了造成的,在mysql中默认连接时间为8小时,如果八小时之内没有访问程序,连接将会断开,造成jdbc fail,你可以设置mysql中my.ini或my.cnf(linux)下的
15 楼 Joo 2008-11-12  
想请教楼主如何做的以及用什么工具进行的这个测试?是否能提供一些有关压力、负载、并发等方面的测试资料或者信息?谢谢

引用
压力、负载测试全部通过了,目前在做稳定性测试,计划是让200人(分属不同的用户组,做不同的操作)负载不间断运行200小时


14 楼 captain 2008-11-12  
calmness 写道
连接中断,有很多种情况,比较难判断,不过我们可以提高系统的容错能力,解决这些异常问题,比如连接中断时,我们可以进行重连并重新开始做被中断的步骤等等一系列的措施。这种异常会经常碰到,实在无法找到程序原因的话,那就尽可能的提供遇到这种情况后如何处理的方法。

多谢calmness指点,说到点子上了,我现在最想了解的就是,如果大家在做稳定性相关测试的时候,遇到类似的情况,一般都采取怎样的措施,不管是从代码还是配置上。


13 楼 calmness 2008-11-12  
连接中断,有很多种情况,比较难判断,不过我们可以提高系统的容错能力,解决这些异常问题,比如连接中断时,我们可以进行重连并重新开始做被中断的步骤等等一系列的措施。这种异常会经常碰到,实在无法找到程序原因的话,那就尽可能的提供遇到这种情况后如何处理的方法。
12 楼 godson_2003 2008-11-12  
我在使用proxool

可能是因为网络问题(没做测试) 数据库连接日志中出现过异常,但是如果网络恢复会自动连接,应用是发布在tomcat下的

上周日因为机房切换电源重起过服务器,到今天发帖 一切正常(访问量不大)

11 楼 captain 2008-11-12  
dennis_zane 写道
这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。


多谢各位,目前公司测试组决定把这个异常原原本本写进测试报告中,我想确认的就是到底是网络层的异常还是工程配置或者代码的原因。看了各位建议后心里稍微有底了。
10 楼 dennis_zane 2008-11-12  
这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。
9 楼 godson_2003 2008-11-12  
楼主能确定 这段测试过程中 网络连接一直畅通么?

是不是因为网络问题会影响稳定性的测试结果?
8 楼 javaboy2006 2008-11-12  
proxool配置文件可以这样配置测试连接sql语句:
<house-keeping-test-sql>
select getdate()
</house-keeping-test-sql>

连接如果还是不稳定建议lz去掉Hibernate直接用jdbc试一试。
7 楼 zhongnanhai.8 2008-11-11  
不论你换各种连接池...对于你来说是换汤不换药的. 你应该考虑下cache上的设计..
6 楼 captain 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>

相关推荐

    无穷的困惑:个体行为的基础是什么?.pptx

    无穷的困惑:个体行为的基础是什么?.pptx

    破解内部审计的困惑与问题--课后测试.docx

    破解内部审计的困惑与问题是一份关于内部审计的课后测试,涵盖了内部审计的基础知识、审计模式、风险评估、内控要素、审计独立性等方面的知识点。本文将对这些知识点进行详细的解释和分析。 一、内部审计的基础知识...

    电改困惑:中国新能源并网为何难.pdf

    电改困惑:中国新能源并网为何难.pdf

    投资界的最大困惑:何处寻找未来的腾讯和阿里

    投资界的最大困惑:何处寻找未来的腾讯和阿里

    兴长信达刘磊的困惑:传统企业电商野蛮生长.docx

    兴长信达刘磊的困惑:传统企业电商野蛮生长.docx

    用python计算lda语言模型的困惑度并作图

    困惑度是一种评估语言模型好坏的指标,定义为exp^{ - (∑log(p(w))) / (N) },其中P(W)是指测试集中出现的每个词的概率,N是测试集中出现的所有词的数量。该指标可以用来评估语言模型的好坏,越小的困惑度表示语言...

    从无穷开始:科学的困惑与疆界.pdf

    人类能直接认知的事物是有限的。但“无穷”二字经常会在思考的瞬间乍现。伊曼努尔·列维纳斯曾经说过:“有些事物能让思想超越一切限制...这一概念自然而然地联系到自然数的连续性上: 1、 2、 3……一个数后面总跟着另

    测试射频电感时,如何正确处理补偿值?

    测试射频电感时,关于补偿值的问题往往让刚接触这类产品的小伙伴感到困惑,这么小的电感量,为什么要在测试电感量的基础上增加补偿值来校准?实际线路设计中该如何处理这个补偿值问题呢?补偿值的庐山真面目 射频...

    产品上线的前戏:可用性测试(包含关键维度分析及过程).docx

    可用性测试的类型可以分为两类,一类是形成性的测试,也即是前期或中期设计测试,在产品产出前对产品可用性进行测试。发现可用性问题,改善产品体验;一类是总结性测试,在产品后期迭代改版,也即产品上线后整个过程...

    性能测试报告模板.rar

    性能测试是IT行业中一个至关重要的环节,特别是在软件开发与维护过程中,它用于评估系统的承载能力、响应速度以及稳定性。"性能测试报告模板.rar"提供的内容是帮助测试人员规范地记录和展示性能测试结果的一种工具。...

    ChatGPT对话系统的可扩展性与稳定性解析.docx

    在稳定性方面,ChatGPT 的生成模型本质上是一个概率模型,存在输出不稳定的问题,可能会导致相同的输入产生不同的响应,从而给用户带来困惑和不确定感。为了提高 ChatGPT 的稳定性,可以考虑引入模型的先验知识和...

    测试界面urong.rar

    2. 性能测试:评估系统在高负载或长时间运行条件下的响应速度、稳定性、资源消耗等。对于界面测试,这可能涉及页面加载速度、交互延迟等方面。 3. 兼容性测试:确保软件在不同的硬件、操作系统、浏览器或移动设备上...

    软件测试报告一详细模板(经典).docx 测试人员写文档的最好模板

    在实践中,测试报告的编写需要注意以下几点: 1. 测试报告应该根据实际情况进行调整和修改,以适应不同的项目和测试需求。 2. 测试报告应该具有明确的结构和格式,以便读者能够快速了解测试的目的、结果和结论。 3....

    一张图解决对互联网运营的困惑:定目标、列手段、配岗位、做考核

    我在给企业做诊断的时候,发现他对运营的了解非常少,直接导致花的都是冤枉钱。老陈对自己的行业超级熟悉,谈起传统那套打法能滔滔不绝讲5个小时,中间不喝水,但遇到互联网这套新玩法就犯难了,不做怕被淘汰,做又...

    测试中的常见问题分析

    在软件开发过程中,测试是至关重要的环节,它确保产品的质量,发现并修复潜在的问题,以提供用户一个稳定、高效和安全的使用体验。本文将详细探讨“测试中的常见问题分析”,涵盖形象类问题、可用性问题和稳定性问题...

    H-B组测试需求评审汇总1

    在本次的“H-B组测试需求评审汇总1...综上所述,此次评审暴露了文档编写、测试设计和执行、以及性能指标定义等方面的问题,这些问题都需要在后续的工作中进行改进和完善,以保证基于Scrapy的WebUI项目的质量和可靠性。

    小小Vir(整人软件源码)

    6. **调试与测试**:在发布整人软件之前,需要进行充分的调试和测试,以确保软件的稳定运行,避免因错误导致的意外情况。 7. **法律问题**:使用整人软件需注意不要侵犯他人的权利,比如侵犯隐私权或知识产权,同时...

    国际宏观评论-天风证券-宏观点评:鲍威尔的困惑——是工作找不到人?还是人找不到工作?.pdf

    国际宏观评论-天风证券-宏观点评:鲍威尔的困惑——是工作找不到人?还是人找不到工作?.pdf

    手机测试经验总结(软件和硬件测试方面)

    初到公司我十分困惑,没有接受过系统的培训,对测试一无所知,既不知道该测试什么,也不知道如何开始测试。 我想涉足手机测试行业的你们,一样会遇到当初我遇到的过的问题,因此这次讲座就是给大家分享我在手机测试...

    App开发者日记:iOS App开发是什么样的?.docx

    在这个过程中,测试是至关重要的环节,因为只有通过广泛的测试,才能确保应用的稳定性和用户体验。然而,iOS平台的测试面临独特的挑战。尽管有iOS模拟器,但真机测试是必不可少的,而苹果对开发者账户在设备上的限制...

Global site tag (gtag.js) - Google Analytics