我们爱分享----事务上下文

zl3450341 2011-08-26 02:49:49
加精

要想进行事务管理,有一个概念必须要清楚,即:必须保证开始事务,和关闭事务是同一个数据库连接。 事务上下文的主要实现,依赖于ThreadLocal,关于该类的作用,不多讲。不清楚的同学可以自己Google查一下。 以面以基于c3po数据源管理为例。


一、封装一个简单的连接池

/**
* @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>
* @功能描述:连接池接口
* @Since Mar 11, 2011
*
*/
public interface PooledConnection {

/**
*
* @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>
* @功能描述:初始化
* @Since Mar 11, 2011
*/
public void init();

/**
*
* @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>
* @功能描述:关闭连接池
* @Since Mar 11, 2011
*/
public void destory();

/**
*
* @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>
* @功能描述:获取连接
* @Since Mar 11, 2011
* @return
* @throws SQLException
*/
public Connection getConnection() throws SQLException;

public void releaseConnection(Connection conn) throws SQLException;
}





/**
* @author <a href="mailto:amoszhou@foxmail.com">大胡子</a>
* @功能描述:基于C3PO连接池的实现类
* @Since Mar 11, 2011
*
*/
public class RYTPooledConnection implements PooledConnection {

/**
* c3po的数据源
*/
private static ComboPooledDataSource ds;

/**
* 关闭数据源
*/
public final void destory() {
ds.close();
}

/**
* 获取数据库连接
*/
public final Connection getConnection() throws SQLException {
return ds.getConnection();
}



/**
* 初始化
*/
public final void init() {
if(null == ds){
ds = new ComboPooledDataSource();
}
}

public void releaseConnection(Connection conn) throws SQLException {
if(null != conn){
conn.close();
}
}
}





以上代码,就是对c3po就行了一个简单的封装,之所以提供接口,目的相信大家都懂,为了方便扩展,以后若是不用C3PO怎么办? 很多人会问,你这里没有提供连接池的大小,初始化连接信息之类,那么我告诉你。你只需要在src目录下,提供
c3p0.properties文件,c3po数据源会自动初始化这些信息。



c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/testdb
c3p0.user=root
c3p0.password=123456
c3p0.initialPoolSize=10
c3p0.minPoolSize=10
c3p0.maxPoolSize=100


这样,我们第一部分的工作就做完了。


二、我们来对事务对象进行一个抽象。定义一个事务对象:


public class Transaction {

/**database connection**/
private Connection connection;

/***trasaction begon count***/
private Integer transCount;

/*****commited cout**/
private Integer commitCount;

/***Deep**/
private Integer transDeep;

/**
*
* @Function:judge is all transaction commited
* @Since Mar 30, 2011
* @return
*/
public boolean isFullExecute(){
return commitCount + 1 == transCount;
}




public Integer getTransDeep() {
return transDeep;
}

public void setTransDeep(Integer transDeep) {
this.transDeep = transDeep;
}

public Connection getConnection() {
return connection;
}

public Integer getTransCount() {
return transCount;
}

public Integer getCommitCount() {
return commitCount;
}

public void setConnection(Connection connection) {
this.connection = connection;
}

public void setTransCount(Integer transCount) {
this.transCount = transCount;
}

public void setCommitCount(Integer commitCount) {
this.commitCount = commitCount;
}


}



关于transCount和commitCount作一个简单的说明,这两个属性是我们来模仿一个简单的嵌套事务的。 这个嵌套事务不像spring的嵌套事务那么复杂。 仅仅是逻辑上的嵌套而已,我们定义一个开启事务的次数,以及一个提交的次数。这样,我们可以用两者判断事务是不是完全提交了。




...全文
3950 112 打赏 收藏 转发到动态 举报
写回复
用AI写文章
112 条回复
切换为时间正序
请发表友善的回复…
发表回复
Maakey 2012-12-27
  • 打赏
  • 举报
回复
对JDBC的东西还不是很了解,慢慢琢磨,技术路线漫长走啊!
sgyyz 2012-09-26
  • 打赏
  • 举报
回复
学习了……
barry0944 2012-06-26
  • 打赏
  • 举报
回复
看得不太懂,先记下
GOon_star 2012-04-13
  • 打赏
  • 举报
回复
spring 管理事物蛮好的,感谢楼猪分享!
ITbiyu 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dongspook 的回复:]

大胡子不错
[/Quote]

对事务理解的比较透彻。
树下_ 2012-02-29
  • 打赏
  • 举报
回复
收了。。。。。
ma361226731 2011-11-05
  • 打赏
  • 举报
回复
每次都潜水,只有碰到特别好的帖子是才例外。。。。。。
chaoxiaobudian 2011-10-24
  • 打赏
  • 举报
回复
不错,果断收藏
ferry_passion 2011-10-21
  • 打赏
  • 举报
回复
mark一下 以后用到事务回头看看
xia__jun 2011-09-30
  • 打赏
  • 举报
回复
好东西。。。。。
  • 打赏
  • 举报
回复
看得出楼主的思维非常清晰!学习了!
SmileToCandy 2011-09-20
  • 打赏
  • 举报
回复
我叫谭果 , 大家记好。
jay_借口 2011-09-07
  • 打赏
  • 举报
回复
mark 一下
gavinloo 2011-09-06
  • 打赏
  • 举报
回复
收藏了,慢慢学习。
灿烂千阳i 2011-09-01
  • 打赏
  • 举报
回复
看着看着就看不懂了,
能用语言简单描述一下使用的流程吗?谢谢!!!
灿烂千阳i 2011-09-01
  • 打赏
  • 举报
回复
看着看着就看不懂了,
能用语言简单描述一下使用的流程吗?谢谢!!!
thegodofwar 2011-09-01
  • 打赏
  • 举报
回复
感觉c3p0和DPCP都不是很好用,你这个和c3p0写在一起,功能是实现了,但是又复杂了不少,有点像JDBC又实际是c3p0加了点东东,感觉很怪....不过最后采用cglib实现动态代理那里倒是个亮点
lk198186 2011-09-01
  • 打赏
  • 举报
回复
不错,要是再搞个多线程版的就更好了!
yuchensuifeng 2011-08-31
  • 打赏
  • 举报
回复
看看.学习中
lqqbeibei 2011-08-31
  • 打赏
  • 举报
回复
收藏了
加载更多回复(87)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧