`

用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的重新调用(二)

 

分享到:
评论

相关推荐

    spring的aop实现

    AOP是一种编程范式,它将关注点分离,使系统中的核心业务逻辑与辅助性任务(如日志、安全检查等)解耦。在Spring中,这些关注点被封装为“切面”(Aspect),并在运行时通过“通知”(Advice)动态地插入到目标对象...

    使用Spring的注解方式实现AOP的细节

    在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...

    模拟spring aop【一】基于jdk动态代理实现的aop

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以包含业务逻辑的某一部分,比如日志、事务管理或安全控制。切面可以在多个对象中统一地应用,提高了代码的复用性...

    Xml配置实现AOP

    AOP是一种设计模式,它允许我们定义横切关注点,并将其与业务逻辑分离,从而提高代码的可维护性和复用性。下面将详细探讨在XML配置中如何实现这两种AOP方式。 ### 1. 基于代理实现AOP切面编程 基于代理的AOP实现...

    Spring Aop的简单实现

    在SLT-Spring-AOP这个项目中,你可以找到具体的实现示例,包括如何定义切面、通知和切入点表达式,以及如何在业务代码中应用这些概念。通过对该项目的深入学习,你将能够更好地理解和掌握Spring AOP的实战应用。

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    java分页 动态代理 aop实现

    AOP是Spring框架的核心特性之一,它允许我们将关注点(如日志、事务管理、安全检查等)从主业务逻辑中分离出来,实现代码的解耦。Spring AOP主要通过两种方式实现: 1. 声明式AOP:基于注解的AOP,通过在方法上添加...

    JAVA 中Spring aop 实现日志记载

    在Java开发中,Spring AOP(面向切面编程)是一个强大的功能,用于实现日志记录。AOP允许我们在不修改原有代码的情况下,插入新的行为,比如日志记录,事务管理等。下面将详细介绍如何在Spring框架中使用AOP来实现...

    maven工程AOP实现demo

    通过这个Maven工程AOP实现的demo,我们学习了如何在Spring项目中使用注解进行AOP编程,包括定义切面、切入点、通知,并配置Spring以启用AOP。这种方式使得我们可以轻松地在不改动业务代码的情况下,插入横切关注点,...

    使用Spring配置文件实现AOP

    在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...

    使用AOP实现监控日志并保存

    通过这种方式,我们可以使用Spring AOP来实现对应用程序的监控日志,而无需侵入业务逻辑。这种解耦使得日志管理和维护变得更加灵活,同时也提高了代码的可读性和可维护性。 在实际项目中,`lib`文件夹通常包含项目...

    基于annotation的aop实现

    基于Annotation的AOP实现是Spring框架的一个重要特性,它极大地简化了AOP的使用。在本篇文章中,我们将深入探讨基于Annotation的AOP实现,特别是动态代理的理念。 首先,了解什么是AOP。AOP的核心概念是“切面”...

    spring aop 实现权限的简单示例

    总结,Spring AOP提供了一种优雅的方式,让我们可以在不侵入业务逻辑的前提下实现权限验证。通过定义切面、通知和切入点表达式,我们可以轻松地控制代码的执行流程,增强代码的可维护性和可扩展性。这个简单的示例...

    Aop jdk proxy实现小例子

    通过JDK Proxy,我们可以在运行时创建一个接口的实现类,并在调用接口方法时插入自定义的处理逻辑,这就是AOP的核心思想——“织入”(Weaving)。下面我们将详细讲解如何使用JDK Proxy实现Aop。 首先,我们需要...

    aop思想的java实现

    1. **不使用AOP实现日志记录** 在没有AOP的情况下,我们通常会在每个方法的开始和结束处手动添加日志记录代码,如下所示: ```java public void doSomething() { System.out.println("开始执行doSomething"); // ...

    AOP__使用JDK中的Proxy技术实现AOP功能

    在Java中,我们可以使用JDK的动态代理(Proxy)来实现AOP的功能,这主要涉及到反射和接口编程。 **JDK动态代理的工作原理** JDK的Proxy类提供了一种机制,可以创建一个代理对象,该对象在调用方法时会执行自定义的...

    SpringBoot基于注解实现Aop

    在Spring Boot框架中,AOP(面向切面编程)是一种强大的设计模式,它允许程序员将关注点分离,比如日志、事务管理等,从核心业务逻辑中抽离出来。本指南将详细介绍如何通过注解来实现Spring Boot中的AOP。 首先,让...

    spring aop 拦截器简单实现

    它是一个实现了`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`或`org.springframework.aop.ThrowsAdvice`等接口的对象,可以在方法调用前后执行自定义逻辑。...

    Xml文件配置实现AOP通知

    **Spring框架中的AOP概念** 在面向切面编程(Aspect Oriented Programming,简称AOP)中,我们关注的是横切关注点,即那些跨越多个对象和模块...Spring的AOP功能强大且易于使用,是企业级应用开发中不可或缺的一部分。

    理解Spring AOP实现与思想 案例代码

    Spring AOP(面向切面编程)是Spring框架中的一个重要特性,它允许开发者在不修改源代码的情况下,通过插入额外的代码(称为切面)来增强应用程序的功能。这主要通过代理模式实现,使得我们可以集中处理系统中横切...

Global site tag (gtag.js) - Google Analytics