`

用AOP实现业务service的重新调用(一)

阅读更多
项目配置

       struts+spring+ibatis

       Websphere+as400+db2

 

遇到的问题

       点击web页面上的一个button,调用后端的业务逻辑,再通过dao访问数据库进行各种事务操作(增删改查等等),但是同样的操作,同样的数据,有的时候偶尔会失败,通过查看日志文件,发现root原因是下面这个exception.

StaleConnectionException,原因是使用中的db connection是失效连接.而且发生异常的时间点没有任何规律.

 

Caused by: 

com.ibm.websphere.ce.cm.StaleConnectionException: [SQL0901] SQLシステム・エラー。

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:80)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)

at java.lang.reflect.Constructor.newInstance(Constructor.java:539)

at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapExceptionHelper(GenericDataStoreHelper.java:621)

at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapException(GenericDataStoreHelper.java:680)

at com.ibm.ws.rsadapter.AdapterUtil.mapException(AdapterUtil.java:2267)

at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.mapException(WSJdbcUtil.java:1191)

at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.execute(WSJdbcPreparedStatement.java:635)

at sun.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)

at java.lang.reflect.Method.invoke(Method.java:613)

at com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.invoke(PreparedStatementLogProxy.java:62)

at com.sun.proxy.$Proxy29.execute(Unknown Source)

at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:289)

at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)

at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)

at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)

at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)

at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)

at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)

at org.springframework.orm.ibatis.SqlMapClientTemplate$1.doInSqlMapClient(SqlMapClientTemplate.java:210)

at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:168)

at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:208)     

 

采取的各种对策

       网上查了各种解决方法,但是试用以后问题仍然没有解决,最后,通过阅读ibm的官方文档后,问题锁定到了ibm的数据库连接池上,ibm的数据库连接池中的连接并不能百分之百地保证是有效连接,但是一旦取得了无效连接,紧接着下一次取得的连接肯定是有效的连接.推荐的方法有两种:

       

       方案A:在每次执行业务sql之前,先调用一个test sql,来试验连接是否有效,有效的话再执行业务sql,但是很明显这样会降低效率,而且关键是试用了以后,并没有解决我们的问题,因为StaleConnectionException的触发时机很随机,test sql的时候连接是好用的,但是到执行业务sql的中途会突然无效,这样一来仍然会失败.

       

       方案B:在应用层面来解决问题,在action调用service开始事务处理的时候,如果StaleConnectionException发生,那么我们再重新调用一次service,相当于重试,因为ibm连接池能够保证获取无效连接后,紧接着获取的肯定是有效的连接.当然重试次数可以自己决定,一般重试一次就OK,次数太多的话,前端页面会明显变慢.

 

所以,我们最终选择了方案B.自己动手,在前端感知不到的情况下,后端重试一次service调用.

 

具体的落地实现请参照

用AOP实现业务service的重新调用(二)

 

分享到:
评论

相关推荐

    使用IoC和AOP重构SOA应用

    本文通过一个Web Service访问的实例,具体描述了SOA应用中所遇到的一系列具体问题,并描述如何利用IoC和AOP...使用AOP方法来解决Web Service调用中的crosscutting concerns,将为系统增加新的功能而不必更改应用程序。

    java面试题

    使用存储过程比单纯的SQL语句要快,可以用一个命令对象来调用存储过程。 索引优缺点? 答:索引可以提高对数据库中数据的检索,缺点是减慢了数据录入速度,同时也增加了数据库的尺寸大小。 什么是事务?什么是事锁? ...

    spring in action英文版

     8.3.6 使用一次性控制器  8.4 视图解析  8.4.1 使用模板视图  8.4.2 解析视图Bean  8.4.3 选择视图解析器  8.5 使用Spring的绑定标签  8.6 处理异常  8.7 小结  第9章 其他视图技术  ...

    Spring.net框架

    如果这三个组件中的任何一个 发生变化,都将导致MainApp.exe的重新编译和部署。从这个角度来看,似乎“针对接口编程”并没有为我们带来太多的好处。 如果能够将“组件装配”工作抽象出来,我们就可以将MainApp的复杂...

    koa-service:web框架,涵盖cron,hook,c ++插件等

    简介 1、包含Rest-ful、...方便对第三方的C++调用及分离计算密集型业务 5、用神经网络实现一个关于分类的计算与预测简易模型一,目录结构|____README.md # 项目说明文件|____app.js # 入口文件|____Dockerfile

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    aspnet Easyui开发框架源码

    适合企业级开发1、框架采用多层架构,反射技术。2、权限管理里实现的功能:按钮管理、菜单管理、角色管理、用户管理、数据字典、单号...如果业务比较单一且相对简单,就可以直接调用或者使用Web Service/Remoting/WCF

    基于JavaScript的数据可视化实验室后台管理系统源码+项目说明(期末大作业).zip

    * 登录状态保持:后端实现token值是否有效,因为大部分接口都需要验证登陆,所以进行方法抽取,用aop注解切面来返回用户信息(需要自定义注解:1.@interface + 注解名,2. 元注解:修饰注解的注解,@Target:注解用...

    Business.Core:这是一个C#服务器端AOP框架,通过对业务服务的注释

    您可以使用任何喜欢的通信层,例如ASP.Net Core MVC,WebAPI,套接字,甚至UI逻辑。 它可以大大提高业务逻辑的可读性和规范。 欢迎来到分支,但是如果您有个好主意,希望您采取行动之前能对它进行彻底的讨论。 该...

    通用Easyui开发框架源码(For Asp.NET)

    如果业务比较单一且相对简单,就可以直接调用或者使用Web Service/Remoting/WCF作为通信框架即可。在实施SOA的过程中,可以自己使用WCF+WF搭建一个小型轻量级的SOA框架,也可以使用诸如Biztalk等软件。 三、注意事项...

    BOS 技术整理

    BOS 技术整理-02 Oracle 数据库安装配置使用 直接安装 打开服务 并尝试连接数据库 ...不需要对 DAO 接口做任何实现, 实际上 spring 会调用 SimpleJpaRepository 实现 struts 2 注解

    CoreWebApi通用框架.rar

    Service层只负责将Repository仓储层的数据进行调用,至于如何是与数据库交互的, 它不去管,这样就可以达到一定程度上的解耦,假如以后数据库要换, 比如MySql,那Service层就完全不需要修改即可。 实体Model数据层...

    Spring.html

    概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 ...

    Spring.3.x企业应用开发实战(完整版).part2

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    Spring3.x企业应用开发实战(完整版) part1

    经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。...

    千方百计笔试题大全

    139、当我使用一个结果集时,如何防止字段为"null"的字域显示在我的HTML输入文本域中? 35 140、如何中SERVLET或JSP下载一个文件(如:binary,text,executable)? 36 141、使用useBean标志初始化BEAN时如何接受初始化...

    java面试宝典

    139、当我使用一个结果集时,如何防止字段为"null"的字域显示在我的HTML输入文本域中? 35 140、如何中SERVLET或JSP下载一个文件(如:binary,text,executable)? 36 141、使用useBean标志初始化BEAN时如何接受初始化...

    ssh(structs,spring,hibernate)框架中的上传下载

    系统Web层将来切换到另一种实现技术的可能性也微乎其微,所以笔者觉得没有必要为了这个业务层完全独立于调用层的过高目标而去搞一个额外的隔离层,浪费了原材料不说,还将系统搞得过于复杂,相比于其它原则,"简单...

    基于jbpm与activiti的工作流平台技术架构介绍

    宏天BPM X3软件平台是一个易于部署和使用的新一代业务流程管理平台,能够以最快的速度帮助您梳理、设计、执行、监控分析和优化业务流程,从业务和IT相结合的完美视角为用户组建长期而久远的卓越BPM流程管 理架构。...

    电子商务商城商品源码20111109

    1.使用ChannelFactory实现WCF的调用,替代了原有的直接使用Service Reference的方式,为后续的WCF认证和授权做准备 2.在配置文件中加入了与Byteart Retail相关的配置节点,这包括:分页设置以及角色的映射信息等 3....

Global site tag (gtag.js) - Google Analytics