为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

WebSphereStaleConnection解决方案

2023-06-22 5页 doc 280KB 11阅读

用户头像 个人认证

is_859878

暂无简介

举报
WebSphereStaleConnection解决方案        WebSphereStaleConnection解决方案                         简介: 本文将介绍StaleConnectionException产生的原理以及几种常见的解决方案。文中给出了详细的配置方法和代码片断,读者可以结合自己的实际情况选择合适的方案。简介使用IBMWebSphereApplicationServer(以下简称WebSphere)和DB2UniversalDatabase(以下简称DB2)建立企业级应用程序,一种推荐的数据库连接模式是利用WebSphere提供的连...
WebSphereStaleConnection解决方案
        WebSphereStaleConnection解决                         简介: 本文将介绍StaleConnectionException产生的原理以及几种常见的解决方案。文中给出了详细的配置方法和代码片断,读者可以结合自己的实际情况选择合适的方案。简介使用IBMWebSphereApplicationServer(以下简称WebSphere)和DB2UniversalDatabase(以下简称DB2)建立企业级应用程序,一种推荐的数据库连接模式是利用WebSphere提供的连接池(ConnectionPool)。在这种方式下WebSphere为客户提供了数据库连接缓存和事务处理机制。但同时产生一个问题是:用户必须处理连接池抛出的StaleConnectionException。本文将介绍StaleConnectionException产生的原理以及几种常见的解决方案。文中给出了详细的配置方法和代码片断,读者可以结合自己的实际情况选择合适的方案。什么是失效连接(StaleConnection)和StaleConnectionException?失效连接是指被WebSphere连接池缓存的,但是由于某种原因已经不可用的数据库连接。原因可能是WebSphere和数据库之间的网络连接中断,DB2服务器关闭或者重新启动。WebSphere并不保证缓存的连接都是有效的,在这种情况下当用户从连接池中取得了一个失效的连接并且用来进行数据库操作时,WebSphere就会抛出StaleConnectionException。在StaleConnectionException出现之前,用户无法判断这是否为一个无效连接。对StaleConnectionException的两种解决方法WebSphere提供了预连接测试这种内置机制来确保返回给用户的连接是可用的。下文中会详细介绍怎样配置使用预连接测试功能。因为预连接测试要经常的连接实际数据库测试连接的有效性,所以这种方式并不适合所有的情况,比如对于性能有很高要求的用户环境。另一种推荐的解决方法是在用户程序中主动的捕获StaleConnectionException,并且重试取得连接。这里涉及到WebSphere的连接池清除功能,WebSphere在抛出StaleConnectionException以后就会刷新或者重建连接池,以确保失效的连接不会继续存在于连接池中。之后用户再从连接池中取得的连接一般来说就是有效的了。但是如果数据库已经停止响应,重试不能无限次地进行下去,所以应用程序应当限定重试数据库访问的次数。连接重试方法在不同的事务管理机制下需要不同的处理,下文中将分别给详细地讲解。配置WebSphere预连接测试预连接测试指在连接返回给客户端前,对连接进行的有效性测试。启动预连接测试可以避免客户因得到无效的连接而引发的StaleConnectionException,配置预连接测试需要指定一条SQL语句供数据库连接测试使用。一般我们会选择执行得最快的SQL语句以尽量减少对性能的影响。下面给出了在WebSphereApplicationServer5.1和6.0中配置预连接测试的例子,应当说明的是WebSphereApplicationServer5.0不支持预连接测试。在WebSphere5.1中启动预连接测试首先我们需要通过修改配置文件来启动预连接测试功能。1.用文本编辑器打开j2c.properties文件。文件安装路径是$WAS_HOME/properties/j2c.properties。2.jdbc/DataSource应替换为用户的数据源的JNDI名称。3.testConnection必须设为true,以表明用户启动预连接测试功能。4.testConnectionRetryInterval为预连接测试失败后重试间隔的秒数。5.重新启动服务器使设置生效。代码1在缺省的j2c.properties中是被注释的,只要去掉注释,然后按照实际系统需求修改即可。代码1true3在WebSphere5.1中配置预连接测试语句然后我们在WebSphere管理控制台(AdminConsole)中配置测试用的SQL语句。1.打开WebSphere的管理控制台。2.定位Resources>JDBC_provider>DataSources>data_source>CustomProperties。3.新建一个用户属性,指定preTestSQLString(大小写敏感)作为属性名。4.指定要测试的SQL语句作为属性值。注:这条SQL语句是用来检查连接是否有效的,必须用有效的SQL语句,并且需要执行速度最快,占用资源最少。每次用户发出数据库连接请求时WebSphere会先调用这条语句做连接尝试。DB2数据库用户可以选择SELECT1FROMSYSIBM.SYSDUMMY1。Oracle用户可以选择SELECTUSERFROMDUAL作为测试连接语句。图1:配置preTestSQLString属性 在WebSphere6.0中启动并配置预连接测试WebSphere6.0提供了更加友好的界面来启动和配置预连接测试,用户不再需要手工修改配置文件。操作步骤如下:1.在管理控制台中,选择需要操作的数据源。2.选择“其他属性”下的WebSphereApplicationServer数据源属性。3.选择预测试连接复选框。4.为预测试连接重试时间间隔输入值,其是以秒为单位测算的。5.为预测试SQL字符串输入有效的SQL语句。SQL语句的要求同5.1配置。捕获重试法捕获重试法需要在用户程序中添加额外逻辑来处理StaleConnectionException。捕获重试法的原理在前面章节中已有描述。其基本步骤为:(请参考图2)1.捕获StaleConnectionException。2.回滚事务。3.如果重试次数小于3(根据实际情况可以修改此值),重新取得连接,执行事务,回到1。4.如果重试次数大于等于3,说明重试仍然无法取得有效连接,退出。图2:捕获重试的程序图 捕获重试法按照事务管理的不同方式可以分为以下三种情况处理:无容器管理事务事务分析:隐含地开始一个本地事务,此时的全局业务就是本地业务,Servlet和JSP都属于这种情况,用户需要处理数据库操作在Servlet和JSP中的情况。javax.transaction.UserTransaction接口使得应用程序能够控制事务边界,这个接口可以有Java客户端程序或者EJB来使用,Java客户端程序需要首先通过JNDI获得UserTransaction对象的引用,然后使用该对象的方法完成事务的开始、提交或者回滚。代码2显示了怎样进行这样的事务处理,程序流程请参考图2。代码2/*InitialContextConnection,Statement,ResultSetdefinitionAndInitializeContext*/DataSourceds=null;UserTransactionut=null;…ds=ctx.lookup("java:comp/env/jdbc/DataSource");ut=(UserTransaction)ctx.lookup("java:comp/UserTransaction");…intretryCount=0;booleanretry=false;do{try{retry=false;ut.begin();//StartanewTransactionds=DataSourceFactory.getDataSource();conn=ds.getConnection();stmt=conn.createStatement();stmt.execute("insertintoCustomersVALUES(01,'Ross')");ut.commit();}catch(com.ibm.websphere.ce.cm.StaleConnectionExceptionsce){ut.setRollbackOnly();if(retryCount<3){retry=true;retryCount++;}else{retry=false;}}catch(Exceptione){e.printStackTrace();}finally{/*releaseconnection,Statement,resultset,*/}}while(retry);容器管理事务事务分析:有容器管理的事务中,用户需要通过修改部署描述符来控制事务的完整性。这种情况下应用程序捕获失效连接异常,然后通过调用setRollbackOnly()使事务回滚,并且向调用者抛出自定义的重试异常。调用者必须位于事务边界以外,不能在事务控制范围内重新开始一个新的事务,当捕获到重试异常时,可以回滚原始连接中涉及的事务并开始新事务。图3是容器管理事务的时序图。1.进入业务代理。2.得到EJB的home接口。3.建立EJB的远程接口。4.调用Sessionbean的业务逻辑方法。5,6,7尝试调用jdbc访问数据库并取得数据对象,容器如果判断出获取的连接是无效连接则抛出StaleConnectionException。8.SessionBean在异常处理中检测到无效连接异常时,调用setRollbackOnly()使事务回滚。并且包装无效异常为重试异常(如:ApplicationRetryException)返回给代理层。9.代理层捕获到重试异常并进行重试连接操作。图3:容器管理事务时序图 设置容器管理事务的方法:修改EJB部署描述文件启用容器管理事务,在EJB部署描述文件ejb-jar.xml中配置需要容器管理事务的方法,并且设置容器管理事务类型:Required或者RequiresNew见图4。图4:EJB部署描述–容器事务 请参考下面的代码片断-重试连接和事务回滚。代码3:捕获到重试异常并重试连接。代码4:EJB容器探测到无效连接,回滚当前事务,并包装为重试异常返回。代码3:DelegatepublicclassBusinessDelegate{…otherbizlogicmethods…publicvoidinsertCustomer()throwsApplicationException{booleanretry=false;intretryCount=0;/*getEJBHomeInterface*//*getEJBRemoteInterface*/do{retry=false;try{appMethod.insertCustomer();}catch(ApplicationRetryExceptionre){if(retryCount<3){retry=true;retryCount++;}else{thrownewApplicationException("Operationfailedafter"+retryCount+"retries.");}}}while(retry);}}代码4:SessionBeanpublicclassBusinessBeanextendsjavax.ejb.SessionBean{/*otherEJBmethods*/publicvoidinsertCustomer()throwsApplicationRetryException{/*Connection,Statement,ResultSetdefinition*/try{DataSourceds=DataSourceFactory.getDataSource();conn=ds.getConnection();stmt=conn.createStatement();stmt.execute("insertintoCustomersVALUES(01,'Ross')");}catch(com.ibm.websphere.ce.cm.StaleConnectionExceptionse){getSessionContext().setRollbackOnly();//rollbackthrownewApplicationRetryException("CaughtStaleConnectionExceptioninBusinessBean");}catch(Exceptionsq){/*dealwithException*/}finally{/*releaseconnection,Statement,resultset,*/}}}Bean管理事务事务分析:对于Bean管理事务(BMT)的类型,我们来考虑sessionBean,首先必需在EJB部署描述符中声明TransactionType为Bean(请参考图5),在程序中控制UserTransaction的begin()启动事务,通过commit()提交事务,通过rollBack()回滚事务。其基本步骤为:(请参考代码5和图2)1.开始新事务。2.设置数据库连接自动提交为假。3.提交事务。4.如果得到无效连接则当前事务回滚并继续重试获得连接,如果超过预定的连接次数(如3次)仍是无效连接则抛出EJBException:通知客户端Bean管理事务(获得有效连接)失败。需要处理EJBException。图5:设置事务类型为Bean管理 代码5:Bean管理的事务处理publicvoidinsertCustomer()throwsEJBException{javax.transaction.UserTransactiontran=getSessionContext().getUserTransaction();booleanretry=false;intretryCount=0;/*Connection,Statement,ResultSetdefinition*/do{try{retry=false;tran.begin();//beginatransactionDataSourceds=DataSourceFactory.getDataSource();conn=ds.getConnection();conn.setAutoCommit(false);stmt=conn.createStatement();stmt.execute("INSERTINTOCUSTOMERSVALUES(01,'Ross')");tran.commit();//commitatransaction}catch(com.ibm.websphere.ce.cm.StaleConnectionExceptionsce){try{tran.rollback();}catch(java.lang.Exceptione){//dealwithexception}if(retryCount<3){retry=true;retryCount++;}else{retry=false;thrownewEJBException("TransactionFailure:"+se.toString());}}catch(java.sql.SQLExceptionsqle){tran.rollback();thrownewEJBException("Transactionfailure:"+sqle.getMessage());}finally{//alwayscleanupJDBCresources/*releaseconnection,Statement,resultset,*/}}while(retry);}结束语在本文中,您了解了WebSphere失效连接和StaleConnectionException产生的原理,并掌握了使用几种处理失效连接并获得有效连接方法。您需要根据如何实现您的应用程序来决定使用那种处理方式。         
/
本文档为【WebSphereStaleConnection解决方案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索