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 恐怕帮不上忙了,具体我也不是很清楚,下面请哪位看管讲讲。。。
分享到:
相关推荐
《jForum与MS SQLServer整合学习笔记》 jForum是一款基于Java的开源论坛系统,它以其高度可定制性、灵活性和强大的功能深受开发者喜爱。在本文中,我们将深入探讨如何将jForum与Microsoft SQL Server(简称MS SQL...
3. **数据库连接jar**:jForum需要与数据库进行交互,存储用户信息、帖子内容等数据。因此,需要数据库驱动的jar包,如mysql-connector.jar(如果使用MySQL)或者ojdbc.jar(如果使用Oracle)。这些jar包提供了与...
【JForum SSO原理与配置】 JForum是一款开源的论坛软件,具备强大的功能。在与其他Web应用集成时,为了提供无缝的用户体验,通常需要实现单点登录(SSO,Single Sign On)。SSO允许用户在一个系统登录后,无需再次...
Jforum使用Hibernate作为ORM工具,负责将数据对象与数据库表进行映射,简化了数据库操作。 2. **视图层(View)**:呈现用户界面。Jforum使用Freemarker模板引擎,允许开发者自定义论坛的显示样式。 3. **控制器...
2. **Web服务器**:JForum通常与流行的Java Web服务器(如Tomcat、Jetty)一起部署。你需要设置并配置一个这样的服务器,以便JForum能够处理HTTP请求。 3. **Servlet容器**:由于JForum是一个Web应用程序,它依赖于...
### JForum 安装部署详解 #### 一、概述 JForum是一款开源的Java类论坛系统,以其小巧高效而著称。它不仅采用了多种JSP新技术,还支持多种数据库(如HSQLDB、Oracle、MySQL、PostgreSQL等),并且遵循MVC设计模式...
3. **配置数据库连接**:Jforum需要与数据库交互存储用户信息和论坛内容。在MyEclipse中,你需要配置Jforum的数据库连接参数,通常是在`config.properties`文件中设置。 4. **部署与运行**:在MyEclipse中配置...
JForum3可能提供了API接口,允许与其他系统进行集成,如社交媒体登录、第三方统计分析等。 通过研究JForum3的源代码,开发者不仅可以学习到Java Web开发的最佳实践,还能掌握如何构建一个健壮、易扩展的社区平台。...
在Java编程领域,JForum3的开发基于Java Servlet和JavaServer Pages(JSP)技术,这使得它能够跨平台运行,并且与各种Java应用服务器兼容。同时,它利用了Model-View-Controller(MVC)设计模式,这种模式有助于分离...
**JForum3 完整项目详解** JForum3 是一个基于Java开发的开源论坛系统,提供了丰富的社区交流功能。这个项目包含的是从版本控制系统Subversion(SVN)中导出的完整源代码,未经任何修改,因此用户可以深入研究其...
Jforum通常使用Hibernate或iBatis等ORM框架,通过SQL语句与数据库交互。理解如何配置数据源、编写实体类、映射文件以及执行查询和更新操作,对于论坛的数据库管理至关重要。 文件监控通常涉及到论坛上传的附件和...
2.3 代码编写与修改:在Eclipse中,对Jforum的源码进行修改或添加新代码,实现新功能。例如,为了实现子论坛功能,可能需要对用户权限管理、板块分类以及导航栏进行调整。 2.4 数据库操作:使用jforum_dump.sql文件...
《JForum漏洞利用源代码解析》 JForum是一款流行的开源Java论坛系统,它以其功能丰富、社区友好而受到许多用户的青睐。然而,如同任何复杂的软件系统一样,JForum也存在安全漏洞,这些漏洞可能被恶意用户利用,对...
本篇文章将深入探讨JForum源码中的核心知识点,以及它如何与FreeMarker结合提供动态网页生成。 1. **FreeMarker模板引擎** FreeMarker是一个用Java语言编写的模板引擎,用于生成动态内容。在JForum中,FreeMarker...
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、...
JForum是一款流行的Java论坛软件,它提供了一个用户友好的界面,支持多语言,且具有高度可扩展性。CKEditor则是一个先进的在线文本编辑器,广泛用于网站内容管理系统,提供丰富的富文本编辑功能。在JForum中整合...
【JForum论坛创建详解】 JForum是一款知名的开源论坛软件,具备多语言支持,包括简体中文,虽然管理界面并未完全汉化。它以其强大的功能、优雅的界面以及清晰的代码结构,成为二次开发的理想选择。JForum基于BSD...
本篇将深入探讨JForum3的源代码和其与数据库的交互,以及如何进行配置。 **一、JForum3源代码结构** JForum3的源代码主要由以下几个部分组成: 1. **Web前端**:基于Servlet和JSP,负责处理HTTP请求,呈现HTML...