- 浏览: 383878 次
- 性别:
文章分类
最新评论
-
wjw103:
You are using old notation for ...
Struts2 入门实例代码 -
hhb19900618:
你好 你这个工程压缩包是不是有问题啊?根本不能导入?
Struts2 入门实例代码 -
it爱:
[list][*]dsadsa[*]dsadsa[*]dsad ...
Spring AOP 学习小结 -
youjianbo_han_87:
和 weblogic 有个毛线关系???????
Weblogic下的自动任务 -
hua839:
是用SmartUpload进行文件上传
背景:
目前有一个系统,系统已经写好了,但是要不停的添加新的功能,用Struts,
业务逻辑写在Action中,以后可能增加一层Service。
业务处理和持久层没有使用任何框架,目前是用Dao担任业务处理加持久层双重操作,
但是有些业务处理很复杂,固设计了一个事务处理框架,大家帮我看下有没有线程安全的问题,
第一次使用ThreadLocal,请多指教。
Connection Holder 代码
TransactionManager 代码
Action 部分代码
DAO 部分代码
ServiceA(){
try{
begin();
ServiceB();
.....
}
}
你可以去参考一下一些OpenSrc Project的TransactionManager如何实现
事务有三个方面要考虑,隔离级别、传递方式和readonly,隔离级别目前默认,传递方式就是楼上说的这个.
这样的情况还没有考虑,如果考虑目前的想法是加入一个计数器,begin 时 count++,rollback 时 如果 count>1 throw exception count--,否则rollback,
commit时如果count>1 count-- 否则commit.
项目现在紧急,没有时间,我考虑的是TransactionManager这个类的接口稳定,至于如何是最合理最优化的实现,以后再说,先弄个Demo类的东西先跑起来.
nested transaction? 所谓ConnectionHolder应该是个Connection Container
如果每次begin都去新开个connection, 那前一次的不是丢失了吗
这样不如把connection直接绑上去
但是我的使用代码是这样的啊,也就是每个Service Method 只使用一个Connection!
第一个版本我是将Connection绑上去的,但是后来多了readonly和rollback两个状态,所以弄了这个Holder的.
ServiceA(){
try{
begin();
ServiceB();
.....
}
}
你可以去参考一下一些OpenSrc Project的TransactionManager如何实现
nested transaction? 所谓ConnectionHolder应该是个Connection Container
如果每次begin都去新开个connection, 那前一次的不是丢失了吗
这样不如把connection直接绑上去
但是我的使用代码是这样的啊,也就是每个Service Method 只使用一个Connection!
第一个版本我是将Connection绑上去的,但是后来多了readonly和rollback两个状态,所以弄了这个Holder的.
nested transaction? 所谓ConnectionHolder应该是个Connection Container
如果每次begin都去新开个connection, 那前一次的不是丢失了吗
这样不如把connection直接绑上去
你把ConnectionHolder绑到ThreadLocal 然后每次再去new一个ConnectionHolder再绑一次?
目前有一个系统,系统已经写好了,但是要不停的添加新的功能,用Struts,
业务逻辑写在Action中,以后可能增加一层Service。
业务处理和持久层没有使用任何框架,目前是用Dao担任业务处理加持久层双重操作,
但是有些业务处理很复杂,固设计了一个事务处理框架,大家帮我看下有没有线程安全的问题,
第一次使用ThreadLocal,请多指教。
Connection Holder 代码
public class ConnectionHolder { private Connection connection = null; private boolean rollback = false; private boolean isreadonly = false; public boolean isIsreadonly() { return isreadonly; } public void setIsreadonly(boolean isreadonly) { this.isreadonly = isreadonly; } public Connection getConnection() { if (null == connection) throw new RuntimeException("connection not exist........"); return connection; } public void setConnection(Connection connection) { this.connection = connection; } public boolean isRollback() { return rollback; } public void setRollback(boolean rollback) { this.rollback = rollback; } }
TransactionManager 代码
public class TransactionManager { private static final Log logger = LogFactory .getLog(TransactionManager.class); private static ThreadLocal _thread = new ThreadLocal(); private static void safeCloseConnection(Connection con) { try { if (null != con) con.close(); con = null; } catch (Exception e) { logger.error("", e); } } public static void begin() { begin(false); } public static void begin(boolean isReadonly) { ConnectionHolder holder = null; Connection con = null; try { con = JNDIUtils.getConnection(); if (!isReadonly) { con.setAutoCommit(false); } holder = new ConnectionHolder(); holder.setConnection(con); holder.setIsreadonly(isReadonly); _thread.set(holder); } catch (Exception e) { safeCloseConnection(con); logger.error("", e); throw new RuntimeException(); } } private static void commit() { ConnectionHolder holder = null; Connection con = null; try { holder = getConnectionHolder(); con = holder.getConnection(); if (!holder.isRollback() && !holder.isIsreadonly()) { con.commit(); con.setAutoCommit(true); } } catch (Exception e) { logger.error("", e); } finally { safeCloseConnection(con); } } public static void end() { commit(); } public static void rollback() { ConnectionHolder holder = null; Connection con = null; try { holder = getConnectionHolder(); holder.setRollback(true); con = holder.getConnection(); if (holder.isIsreadonly()) { throw new RuntimeException("readonly cannot rollback...."); } con.rollback(); con.setAutoCommit(true); } catch (RuntimeException e) { throw e; } catch (Exception e) { logger.error("", e); } finally { safeCloseConnection(con); } } private static ConnectionHolder getConnectionHolder() { ConnectionHolder holder = (ConnectionHolder) _thread.get(); if (null != holder) return holder; throw new RuntimeException("connection holder not exist......."); } public static Connection openConnection() { Connection con = getConnectionHolder().getConnection(); if (null != con) return con; throw new RuntimeException("connection not exist......."); } }
Action 部分代码
public ActionForward deleteResourceXqzy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { TransactionManager.begin(); //事务开始 /** 多次DAO代码调用 业务处理 多次DAO代码调用 */ } catch (Exception ex) { TransactionManager.rollback(); //事务回滚 //其它操作 } finally { TransactionManager.end(); //事务提交 //其它操作 } return mapping.findForward("test"); }
DAO 部分代码
public static void deleteResourceZyfb() throws Exception { String sql = null; PreparedStatement ps = null; try { Connection con = TransactionManager.openConnection(); sql = ""; ps = con.prepareStatment(sql); ps.executeUpdate(); } finally { safeCloseStatementOrRs(ps); } }
评论
9 楼
icefire
2007-04-12
有个问题,在end的同时,是否应该ThreadLocal.remove()呢?
8 楼
icefire
2007-04-09
正在做毕业设计,不想引入Spring,时间不够,学不过来。
就借用下!!
PS:我会保留版权信息的!呵呵!
就借用下!!
PS:我会保留版权信息的!呵呵!
7 楼
jamesby
2007-02-28
JAVA_ED 写道
ServiceA(){
try{
begin();
ServiceB();
.....
}
}
你可以去参考一下一些OpenSrc Project的TransactionManager如何实现
事务有三个方面要考虑,隔离级别、传递方式和readonly,隔离级别目前默认,传递方式就是楼上说的这个.
这样的情况还没有考虑,如果考虑目前的想法是加入一个计数器,begin 时 count++,rollback 时 如果 count>1 throw exception count--,否则rollback,
commit时如果count>1 count-- 否则commit.
项目现在紧急,没有时间,我考虑的是TransactionManager这个类的接口稳定,至于如何是最合理最优化的实现,以后再说,先弄个Demo类的东西先跑起来.
6 楼
JAVA_ED
2007-02-27
jamesby 写道
JAVA_ED 写道
jamesby 写道
to JAVA_ED:
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
nested transaction? 所谓ConnectionHolder应该是个Connection Container
如果每次begin都去新开个connection, 那前一次的不是丢失了吗
这样不如把connection直接绑上去
但是我的使用代码是这样的啊,也就是每个Service Method 只使用一个Connection!
public ActionForward methodName(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { TransactionManager.begin(); //事务开始 /** 多次DAO代码调用 业务处理 多次DAO代码调用 */ } catch (Exception ex) { TransactionManager.rollback(); //事务回滚 //其它操作 } finally { TransactionManager.end(); //事务提交 //其它操作 } return mapping.findForward("test"); }
第一个版本我是将Connection绑上去的,但是后来多了readonly和rollback两个状态,所以弄了这个Holder的.
ServiceA(){
try{
begin();
ServiceB();
.....
}
}
你可以去参考一下一些OpenSrc Project的TransactionManager如何实现
5 楼
jamesby
2007-02-27
JAVA_ED 写道
jamesby 写道
to JAVA_ED:
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
nested transaction? 所谓ConnectionHolder应该是个Connection Container
如果每次begin都去新开个connection, 那前一次的不是丢失了吗
这样不如把connection直接绑上去
但是我的使用代码是这样的啊,也就是每个Service Method 只使用一个Connection!
public ActionForward methodName(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { TransactionManager.begin(); //事务开始 /** 多次DAO代码调用 业务处理 多次DAO代码调用 */ } catch (Exception ex) { TransactionManager.rollback(); //事务回滚 //其它操作 } finally { TransactionManager.end(); //事务提交 //其它操作 } return mapping.findForward("test"); }
第一个版本我是将Connection绑上去的,但是后来多了readonly和rollback两个状态,所以弄了这个Holder的.
4 楼
JAVA_ED
2007-02-27
jamesby 写道
to JAVA_ED:
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
nested transaction? 所谓ConnectionHolder应该是个Connection Container
如果每次begin都去新开个connection, 那前一次的不是丢失了吗
这样不如把connection直接绑上去
3 楼
jamesby
2007-02-27
to JAVA_ED:
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
什么意思,能否详细说明一下?
不new ConnectionHolder()那用同一个ConnectionHolder?
2 楼
JAVA_ED
2007-02-27
jamesby 写道
如果以上是成熟的,无线程安全性问题,也可以考虑实现一个TransactionTemplate,代码类似下面这个.
TransactionTemplate
Action 部分代码
其实Spring已经有了很完善的功能,不过目前不想对老系统使用Spring!还望大家多给意见,哪些设计的不合理,尤其是线程安全性方面的.当然上面的代码并没有对异常体系进行设计!还是比较习惯使用Exception和RuntimeException这两个异常.
TransactionTemplate
public void execute() throws Exception{ try { TransactionManager.begin(); process(); }catch(Exception ex){ TransactionManager.rollback(); throw e; }finally{ TransactionManager.end(); } } abstract protected void process() throws Exception{}
Action 部分代码
public ActionForward deleteResourceXqzy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { new TransactionTemplate() { public void process() { } }.execute(); } catch (Exception ex) { } return mapping.findForward("test"); }
其实Spring已经有了很完善的功能,不过目前不想对老系统使用Spring!还望大家多给意见,哪些设计的不合理,尤其是线程安全性方面的.当然上面的代码并没有对异常体系进行设计!还是比较习惯使用Exception和RuntimeException这两个异常.
你把ConnectionHolder绑到ThreadLocal 然后每次再去new一个ConnectionHolder再绑一次?
1 楼
jamesby
2007-02-23
如果以上是成熟的,无线程安全性问题,也可以考虑实现一个TransactionTemplate,代码类似下面这个.
TransactionTemplate
Action 部分代码
其实Spring已经有了很完善的功能,不过目前不想对老系统使用Spring!还望大家多给意见,哪些设计的不合理,尤其是线程安全性方面的.当然上面的代码并没有对异常体系进行设计!还是比较习惯使用Exception和RuntimeException这两个异常.
TransactionTemplate
public void execute() throws Exception{ try { TransactionManager.begin(); process(); }catch(Exception ex){ TransactionManager.rollback(); throw e; }finally{ TransactionManager.end(); } } abstract protected void process() throws Exception{}
Action 部分代码
public ActionForward deleteResourceXqzy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { new TransactionTemplate() { public void process() { } }.execute(); } catch (Exception ex) { } return mapping.findForward("test"); }
其实Spring已经有了很完善的功能,不过目前不想对老系统使用Spring!还望大家多给意见,哪些设计的不合理,尤其是线程安全性方面的.当然上面的代码并没有对异常体系进行设计!还是比较习惯使用Exception和RuntimeException这两个异常.
发表评论
-
weblogic.xml文件代码示例
2008-04-19 10:44 8891<?xml version="1.0" ... -
java 运行版本问题
2008-02-26 08:33 1828在JDK 5.0 上编译好的class,即使未用到任何5.0的 ... -
sqlserver 2000 1433 端口未打开的问题
2008-02-26 08:32 2567需要安装SqlServer 2000 SP4 -
我的一次weblogic 8升级到weblogic9遇到的问题.
2007-04-29 18:17 51541、web应用的乱码问题。 原来的基于weblogic8的应用 ... -
关于手机浏览器的问题?
2007-04-20 12:07 7367现在有一个新的需求,本来目前的基于web的软件开发已经完成,但 ... -
Weblogic下的自动任务
2007-04-03 14:13 2941package com.jamesby.listener; ... -
是用SmartUpload进行文件上传
2007-04-03 14:06 5644package com.jamesby.file.servle ... -
文件下载Servlet
2007-04-03 13:57 4350package com.jamesby.action; ... -
Java 5.0 枚举
2007-03-12 15:09 2208http://www.ibm.com/developerwor ... -
关于web-inf/classes的优先级高于web-inf/lib的优先级
2007-03-08 12:11 4854背景 一直以来都知道web-inf/classes的优先级高 ... -
深入了解WebLogic的类装载机制详解
2007-03-01 19:05 2229http://publish.it168.com/2005/1 ... -
我的一次EJB重构过程
2007-03-01 12:13 2094背景 因为历史遗留问题,代码写的杂乱无章,没有条理,而且该 ... -
如何防止用户恶意的F5刷新操作的问题?
2007-02-25 18:45 13138背景: 问题是这样的,系统持久层采用ibatis架构,系统 ... -
关于Service和DAO层的功能划分的迷惑
2007-02-13 17:27 20709Service 层的代码 public class Gene ... -
关于Service调用Service 的思考
2007-02-10 20:04 5185以前做软件都是随便写几个Service,纯粹为了Service ... -
通过IP访问服务器session失效,计算机名则可以,什么原因?
2007-02-08 17:26 4805最近开发一个新项目采用Spring MVC+Spring+iB ... -
Tomcat 类加载机制
2007-02-08 12:04 1761yahoo中国的一个面试题,转至水木. Tomcat Ser ... -
Weblogic 8.1.3 下数据库连接池的配置问题
2007-02-07 21:00 2599weblogic8.1.3下同一个数据库连接池最好只被一个we ... -
Weblogic 8.1.3 下如何使用JSTL
2007-02-07 20:56 3188一、下载jakarta-taglibs-standard-1. ... -
两级联动Select的TAG实现
2007-02-02 18:12 2071JSP实现太复杂而且不方便,那来个幽雅点的Tag包装! pac ...
相关推荐
Transaction manager 在 sqlx 的基础上实现了事务管理,使得在复杂的业务逻辑中处理数据库事务更为容易。 1. **sqlx 库介绍** sqlx 提供了比 `database/sql` 更高级别的抽象,它支持结构化绑定,允许开发者将 SQL ...
Spring Boot默认使用JpaTransactionManager,但这里我们需要MyBatis的SqlSessionTemplate,所以使用`@EnableTransactionManagement`和`@Bean`创建MyBatis的TransactionManager。 6. **Mapper配置** 需要为每个数据...
本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...
创建多数据源的配置文件,包括AtomikosDataSourceBean的定义、TransactionManager的配置以及DynamicRoutingDataSource的实现。在业务代码中,通过`@Transactional`注解开启分布式事务,并在必要时使用`ThreadLocal`...
4. **TransactionManager**: dbutils还提供了事务管理功能,通过TransactionManager可以方便地进行数据库事务的控制,实现事务的开始、提交、回滚等操作。 `BaseDAO` 的设计通常包含以下要点: 1. **泛型**: ...
JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory1); return transactionManager; } @Bean(name = ...
例如,JPA事务使用JpaTransactionManager实现,JDBC事务使用DataSourceTransactionManager实现。 在程序中定义事务管理器的代码如下: @Bean public PlatformTransactionManager transactionManager() { Jpa...
Spring框架中事务配置是非常重要的一部分,通常由三个组成部分组成,即DataSource、TransactionManager和代理机制。无论采取何种配置方式,代理机制部分总是变化的,而DataSource和TransactionManager部分则根据数据...
Spring配置文件则用于配置Spring的Bean,如DataSource、SessionFactory、TransactionManager以及SpringMVC的相关配置。 接下来,创建数据库模型(实体类),这些类将与数据库表进行映射。每个实体类对应一个数据库...
本篇文章将深入探讨如何通过XML配置实现声明式事务管理。 首先,理解Spring中的事务管理概念是至关重要的。事务是一组操作,这些操作要么全部成功,要么全部失败,确保数据的一致性。在Java环境中,JDBC API提供了...
每个数据源都有自己的`DataSource`实例,可以是JDBC、Hibernate或MyBatis等。首先,我们需要在`application.properties`或`application.yml`中为每个数据源配置相关的连接信息,如URL、用户名、密码等。例如: ```...
压缩包中的`ormliteDemo`项目是一个实际的示例,包含了上述所有概念的实现。通过查看和运行这个项目,你可以更好地理解ORMLite在Android中的具体用法。 总结,ORMLite为Android开发者提供了便捷的数据库操作方式,...
【基于JTA的跨数据库分布式事务的实现】 在大规模的企业级应用中,常常涉及到多个数据库系统的交互,这就需要实现跨数据库的分布式事务处理。Java Transaction API(JTA)是Java平台上的标准,用于管理和协调跨多个...
通常,每个数据源都有自己的`PlatformTransactionManager`实例。 5. **测试与验证**:编写单元测试或集成测试来确保读写分离功能正常工作,查看是否能正确地将读操作路由到读库,写操作路由到写库。 总结来说,...
在Spring框架中,注解是实现声明式事务管理的主要手段之一。相较于编程式事务管理,声明式事务管理更易于维护,因为事务管理的逻辑被声明在配置或元数据中,而不是散落在业务代码中。本篇文章将深入探讨如何使用注解...
Mybatis则是一个轻量级的持久层框架,它简化了SQL操作,但在JTA事务中,Mybatis需要配合Spring的TransactionManager来工作,使得每个数据库操作都在同一个事务上下文中。 实现步骤如下: 1. 添加依赖:在Spring ...
本文详细介绍了Spring事务配置中的五种方式:基于XML的声明式事务管理、基于注解的声明式事务管理、编程式事务管理、通过AOP实现的事务管理以及通过代理模式实现的事务管理。每种方式都有其适用场景,开发者可以根据...
然后,Atomikos作为JTA的实现,提供了UserTransaction和TransactionManager的具体实现。UserTransaction接口允许应用程序开始、提交、回滚事务,而TransactionManager则负责事务的生命周期管理和资源协调。Atomikos...