`
xuyan2680
  • 浏览: 30751 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

jforum事务与ThreadLocal

阅读更多
jforum事务控制是粗粒度控制的,也就是说,对每个请求Service的线程,如果需要获得数据库连接,则
JForumExecutionContext ex = get();
		Connection c =  ex.conn;
		
		if (validate && c == null) {
			c = DBConnection.getImplementation().getConnection();
			
			try {
				c.setAutoCommit(!SystemGlobals.getBoolValue(ConfigKeys.DATABASE_USE_TRANSACTIONS));
			}
			catch (Exception e) {
                //catch error autocommit
            }
			
			ex.setConnection(c);
			set(ex);
		}

JForumExecutionContext 是一个执行上下文,持有 connection引用。JForumExecutionContext对每个请求的线程都保存当前 线程的 执行上下文(JForumExecutionContext),每次需要数据库连接时,都从当前线程的本地变量中获得连接,当前线程中的数据库连接为空,就新建一个连接。如果系统配置了需要事务,则:
c.setAutoCommit(!SystemGlobals.getBoolValue(ConfigKeys.DATABASE_USE_TRANSACTIONS));

在此处设置了连接是否 自动提交。
在每次使用完connection,不必关闭连接,而是程序统一在servlet 的Service方法中完成本次请求后释放资源,判断是否提交事务,并且关闭连接。

JForumExecutionContext.finish();

finish实现如下:

public static void finish()
	{
		Connection conn = JForumExecutionContext.getConnection(false);
		
		if (conn != null) {
			if (SystemGlobals.getBoolValue(ConfigKeys.DATABASE_USE_TRANSACTIONS)) {
				if (JForumExecutionContext.shouldRollback()) {
					try {
						conn.rollback();
					}
					catch (Exception e) {
						logger.error("Error while rolling back a transaction", e);
					}
				}
				else {
					try {
						conn.commit();
					}
					catch (Exception e) {
						logger.error("Error while commiting a transaction", e);
					}
				}
			}
			
			try {
				DBConnection.getImplementation().releaseConnection(conn);
			}
			catch (Exception e) {
				logger.error("Error while releasing the connection : " + e, e);
			}
		}
		
		userData.set(null);
	}


这样的实现,事务是控制住了,但是事务的跨度太大,粒度太粗,相反,spring的事务控制 就可以控制到比较细了。
spring声明式事务控制,通过aop,动态代理生成需要控制事务的类,并且注入事务拦截接口而实现的。在spring本地事务中,也是通过ThreadLocal 来持有对当前线程的获得的数据库连接的,使用ThreadLocal好处就是在任何地方都能访问当前线程保存在其中的数据,而不用担心多线程访问的问题,因为每个线程都只能访问当前线程对应的那部分数据。不过对分布式事务的实现而言,ThreadLocal 恐怕帮不上忙了,具体我也不是很清楚,下面请哪位看管讲讲。。。
分享到:
评论
2 楼 flourish.sun 2012-06-23  
赞一下。在学习jforum中,你的帖子很有帮助,显然,偶不是博主指的看官啦!
1 楼 xuyan2680 2010-01-25  
怎么没有看官讲讲呢。。

相关推荐

    JForum3 jforum java 开源论坛 论坛

    JForum3 jforum java 开源论坛 论坛

    JForum论坛数据库表结构.rar

    1、附件关系表JFORUM_ATTACH 2 2、附件详细信息表JFORUM_ATTACH_DESC 2 3、附件配置限定关系表JFORUM_ATTACH_QUOTA 2 4、封锁表JFORUM_BANLIST 2 5、标识表JFORUM_BANNER 3 6、书签表JFORUM_BOOKMARKS 3 7、...

    jforum3.0所需要的jar包

    jforum3.0所需要的jar包

    JForum_SSO_-_JForum单点登陆原理与配置

    对于我们已有的WEB应用中的用户,若该用户已经登陆,并通过 联结迁移到JForum页面时,JForum要能够识别该用户已经登陆(不需要二次登陆)才不会让用户感到别扭(对用户来说,就好像使用的是同一个系统似的)。...

    jforum功能说明

    JForum是著名的开源论坛,支持多达数十种的多国语言,其中包括简体中文。JForum功能强大,界面美观,加上代码结构清晰,而且采用的是BSD授权,不必担心不必要的版权纠纷。可以说JForum是论坛二次开发的绝佳选择。 ...

    Jforum数据库

    JForum - Java论坛系统 数据库表结构,如:附件关系表JFORUM_ATTACH,附件详细信息表JFORUM_ATTACH_DESC,用户分组表JFORUM_GROUPS等表结构说明,如帖子表JFORUM_POSTS说明: 名称 字段名 字段类型 字段说明 帖子...

    jforum+ckeditor整合案例

    jforum与ckeditor整合,替换自带的编辑器

    jforum论坛整合说明

    本文档是自己在做jforum二次开发过程中遇到的一些问题的总结。如果你做jforum整合,相信会给你帮助。

    Jforum安装部署

    jdk1.6+tomcat6+postgresql+jforum2.1.9环境下,jforum的安装部署,以及一些简单的心得,共初学者参考

    Jforum论坛数据库架构

    Jforum论坛数据库架构Jforum论坛数据库架构

    jforum漏洞利用源代码

    jforum漏洞利用源代码

    jforum开源的论坛文档

    jforum开源的论坛文档jforum开源的论坛文档jforum开源的论坛文档

    JForum3 完整项目

    jforum 完整源代码,从svn上 导出 没有任何修改

    JForum数据库ER图

    JForum 开源论坛系统的 数据库ER图,很详细。

    JForum2.6.2.rar

    1、包含jforum2.6.2的war包、源码包 2、war包可直接放在tomcat的webapps目录下 3、2.6.2版本里面自带汉化功能,在http://localhost:8080/jforum/install.jsp安装时,注意选择中文

    JForum 2.1.9 源码包.zip

    JForum 是采用Java开发的功能强大且稳定的论坛系统。它提供了抽象的接口、高效的论坛引擎以及易于使用的管理界面,同时具有完全的权限控制、多语言支持(包括中文)、高性能、可自定义的用户接口、安全、支持多...

    jforum说明文档 源码解析 单点登录 jforum缓存

    jforum的开发文档,以及源码解析 数据库 重要配置文件和包,缓存 权限控制 单点登录

    jforum安装部署指南

    jforum安装部署指南:修改对应的数据库文件JFORUM\WEB-INF\config\database下面。例如:mysql.properties修改其中的数据库信息

    jforum论坛图片资源

    用于配置中文jforum,里面包含各种语言的图片文件,将其中的zh_CN目录复制到jforum安装目录下的templates\default\images。就可以显示中文图片

    jforum3源代码 数据库

    jforum3源代码数据库

Global site tag (gtag.js) - Google Analytics