`
mikey.tsu
  • 浏览: 133820 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

通过JTOM,用过滤器实现事务控制

阅读更多

利用Jotm和过滤器实现分布式事务管理功能

 

1、下载ow2-jotm-dist-2.2.1-bin.tar.gz,将其目录ow2-jotm-dist-2.2.1\lib的jar拷贝到Tomcat 6.0\lib下

 

2、配置项目下的web.xml

    

<resource-env-ref>   
        <description>DB Connection</description>   
        <resource-env-ref-name>jdbc/myDB</resource-env-ref-name>   
        <resource-env-ref-type>   
            javax.sql.DataSource   
        </resource-env-ref-type>   
    </resource-env-ref>
或者配置Tomcat6的conf中编辑context.xml文件,为Tomcat配置数据源和事务如下如下:
 <Context>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <Resource name="jdbc/myDB" auth="Container"
   type="javax.sql.DataSource" username="test" password="test"
   driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
   url="jdbc:sqlserver://192.168.0.1:1433;databaseName=test"
   maxActive="8" maxIdle="30" maxWait="10000" />
  <Transaction factory="org.objectweb.jotm.UserTransactionFactory"
   jotm.timeout="60" />
  <Manager
   className="org.apache.catalina.session.PersistentManager"
   saveOnRestart="false">
   <Store className="org.apache.catalina.session.FileStore" />
  </Manager>
 </Context> 

3、获取Connection

    

  /**  
     * 获取Connection  
     * @return con  
     */  
    public Connection getConnection()   
    {   
        try  
        {   
            Context ctx = new InitialContext();   
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myDB");   
            return ds.getConnection();   
        }   
        catch (Exception ex)   
        {   
            log.error("Can not get db connection...", ex);   
        }   
        return null;   
    }

 

4、过滤器代码

   

import java.io.IOException;   
  
import javax.naming.Context;   
import javax.naming.InitialContext;   
import javax.servlet.Filter;   
import javax.servlet.FilterChain;   
import javax.servlet.FilterConfig;   
import javax.servlet.ServletException;   
import javax.servlet.ServletRequest;   
import javax.servlet.ServletResponse;   
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.http.HttpServletResponse;   
import javax.transaction.UserTransaction;   
  
import com.autocreate.util.Log;   
  
/**  
 * 登录过滤器  
 *   
 * @author Administrator  
 */  
public class LoginFilter implements Filter   
{   
    private static final String CONTENT_TYPE = "text/html; charset=UTF-8";   
       
    private HttpServletRequest req = null;   
       
    private HttpServletResponse res = null;   
       
    public void init(FilterConfig arg0) throws ServletException   
    {   
    }   
       
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,   
        ServletException   
    {   
        req = (HttpServletRequest)request;   
        res = (HttpServletResponse)response;   
           
        // 设置编码格式   
        req.setCharacterEncoding("UTF-8");   
        res.setContentType(CONTENT_TYPE);   
           
        String requestURI = req.getRequestURI();   
        //Log.getLogger().info("requestURI = " + requestURI);   
           
        // HttpSession session = req.getSession();   
        // PrintWriter out = res.getWriter();   
           
        transactionFilter(request, response, chain, requestURI);   
    }   
       
    /**  
     * 事务过滤器  
     * @param request  
     * @param response  
     * @param chain  
     * @param requestURI  
     * @throws ServletException   
     * @throws IOException   
     */  
    private void transactionFilter(ServletRequest request, ServletResponse response, FilterChain chain,   
        String requestURI) throws IOException,   
        ServletException   
    {   
        String[] params = {"insert", "modify", "delete"};   
        if (checkUrl(requestURI, params))   
        {   
            UserTransaction tx = null;   
            try  
            {   
                Context ctx = new InitialContext();   
                tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");   
                tx.begin();   
                chain.doFilter(request, response);   
                tx.commit();   
            }   
            catch (Exception e)   
            {   
                try  
                {   
                    res.sendRedirect("manager/AddFailed.jsp");   
                    tx.rollback();   
                }   
                catch (Exception e1)   
                {   
                    Log.getLogger().error("rollback failed...", e1);   
                }   
                Log.getLogger().error("Operation failed...", e);   
            }   
            return;   
        }   
        else  
        {   
            chain.doFilter(request, response);   
        }   
    }   
       
    /**  
     * 验证requestURI的是否含有指定数组里的值  
     * @param requestURI  
     * @param url  
     * @return  
     */  
    private boolean checkUrl(String requestURI, String[] url)   
    {   
        for (int i = 0; i < url.length; i++)   
        {   
            if (requestURI.indexOf(url[i]) != -1)   
            {   
                return true;   
            }   
        }   
        return false;   
    }   
       
    public void destroy()   
    {   
    }   
}  

 

分享到:
评论

相关推荐

    开源分布式事务管理Jtom

    通过使用JTA,Jtom可以提供一种统一的方式来管理跨越不同系统的事务,从而简化了开发过程。 【标签】中的"Jtom"是我们讨论的核心,它是实现分布式事务的关键组件。"jta"是指Java Transaction API,是Java EE的一...

    JTOM分布式事物配置

    NULL 博文链接:https://sd8089730.iteye.com/blog/1621382

    JTOM ccm_recover.

    - **日志记录**:JTOM 使用事务日志来跟踪事务的活动。每个事务的操作都会被记录到日志中,包括事务的开始、更新操作以及提交或回滚的决定。 - **检查点**:在系统运行期间,JTOM 会定期创建检查点,这是一个系统...

    java Tomcat6 JTOM Project

    在Tomcat6中配置好的java工程已经配置好JTOM的DataSource和UserTransaction,打包下载.请自行配置数据库与补全Tomcat6中的公共文件.然后就可以直接访问页页http://127.0.0.1:8080/DaoTemplate_my/books.jsp和...

    JTA事务源码示例

    Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...

    spring+hibernate+jtom demo

    在本文中,我们将深入探讨如何使用Spring、Hibernate和JOTM进行分布式事务管理,以实现在一个Service方法中同时操作两个不同数据源的数据,并确保任何错误都能导致所有操作回滚。首先,我们需要了解这些技术的基本...

    jotm-2.0.11.MR5.rar_Jotm jar_jotm_jotm-2.0.11.MR5_jotm.jar _jtom

    JOTM(Java Open Transaction Manager)是一款开源的事务管理器,专为Java应用程序设计,它提供了强大的事务处理能力,支持JTA(Java Transaction API)规范,使得在分布式环境中进行事务管理变得更加便捷。...

    JOTM包

    JOTM 是一个基于Java开放源代码的事务处理管理器。它遵循JTA APIs规范与Business Transaction Protocol(BTP)规范以提供了对Web Service的支持。

    jotm-2.0.11.MR5.tgz

    标题中的"jotm-2.0.11.MR5.tgz"是一个软件发行版本的标识,这里的"jotm"是Java Open Transaction Manager的缩写,它是一个开源的事务管理器,遵循JTA(Java Transaction API)标准。这个tgz文件是一个归档文件,通常...

    前后端分离的仓库物料管理系统(源代码+部署视频教程)

    项目使用的软件工具: 1、Intellij IDEA 2、Visual Studio Code 3、HBuilder X 4、微信开发者工具 5、Navicat Premium 6、PDManer 7、Xshell 项目运行环境(本地环境windows,部署环境Linux): 1、JDK 1.8...

Global site tag (gtag.js) - Google Analytics