利用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()
{
}
}
分享到:
相关推荐
通过使用JTA,Jtom可以提供一种统一的方式来管理跨越不同系统的事务,从而简化了开发过程。 【标签】中的"Jtom"是我们讨论的核心,它是实现分布式事务的关键组件。"jta"是指Java Transaction API,是Java EE的一...
NULL 博文链接:https://sd8089730.iteye.com/blog/1621382
- **日志记录**:JTOM 使用事务日志来跟踪事务的活动。每个事务的操作都会被记录到日志中,包括事务的开始、更新操作以及提交或回滚的决定。 - **检查点**:在系统运行期间,JTOM 会定期创建检查点,这是一个系统...
在Tomcat6中配置好的java工程已经配置好JTOM的DataSource和UserTransaction,打包下载.请自行配置数据库与补全Tomcat6中的公共文件.然后就可以直接访问页页http://127.0.0.1:8080/DaoTemplate_my/books.jsp和...
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...
在本文中,我们将深入探讨如何使用Spring、Hibernate和JOTM进行分布式事务管理,以实现在一个Service方法中同时操作两个不同数据源的数据,并确保任何错误都能导致所有操作回滚。首先,我们需要了解这些技术的基本...
JOTM(Java Open Transaction Manager)是一款开源的事务管理器,专为Java应用程序设计,它提供了强大的事务处理能力,支持JTA(Java Transaction API)规范,使得在分布式环境中进行事务管理变得更加便捷。...
JOTM 是一个基于Java开放源代码的事务处理管理器。它遵循JTA APIs规范与Business Transaction Protocol(BTP)规范以提供了对Web Service的支持。
标题中的"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...