jboss5 jta事物配置

需求:
现有数据库 A,B,C,D
要求A,B A,C A,D 操作数据库时能够同步。
使用的数据库mssql 2005 驱动sqljdbc
解决方法:
1.基于容器的方法解决,使用jboss,weblogic
2.使用开源的框架 jtom等来解决

我选择了基于容器的方法,用jboss5(因为免费),原先不熟悉jboss配置起来开始比较麻烦的,
[color=red]步骤1:[/color]
在%jboss-home%/docs/examples/jca 找到mssql-xa-ds.xml拷贝到%jboss-home%/server/default/deploy 下修改配置文件

<datasources>
<xa-datasource>
<jndi-name>MSSQLXADS</jndi-name>
<!-- uncomment to enable interleaving <interleaving/> -->
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">localhost</xa-datasource-property>
<xa-datasource-property name="DatabaseName">web_charge</xa-datasource-property>
<xa-datasource-property name="SelectMethod">cursor</xa-datasource-property>
<xa-datasource-property name="URL">jdbc:sqlserver://localhost:1433</xa-datasource-property>

<!-- sql to call when connection is created -->

<new-connection-sql>select 1</new-connection-sql>
<!-- sql to call on an existing pooled connection when it is obtained from pool -->
<check-valid-connection-sql>select 1</check-valid-connection-sql>


<!-- not sure if these should be here-->
<user-name>tan</user-name>
<password>123456</password>
<use-java-context>false</use-java-context>

<min-pool-size>10</min-pool-size>
<max-pool-size>60</max-pool-size>
<idle-timeout-minutes>15</idle-timeout-minutes>
<blocking-timeout-millis>5000</blocking-timeout-millis>




<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>MSSQLXADS2005</type-mapping>
</metadata>


</xa-datasource>


<xa-datasource>
<jndi-name>MSSQLXADS2</jndi-name>
<!-- uncomment to enable interleaving <interleaving/> -->
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">192.168.3.44</xa-datasource-property>
<xa-datasource-property name="DatabaseName">test_charge</xa-datasource-property>
<xa-datasource-property name="SelectMethod">cursor</xa-datasource-property>
<xa-datasource-property name="URL">jdbc:sqlserver://192.168.3.44:1433</xa-datasource-property>

<!-- sql to call when connection is created -->

<new-connection-sql>select 1</new-connection-sql>
<!-- sql to call on an existing pooled connection when it is obtained from pool -->
<check-valid-connection-sql>select 1</check-valid-connection-sql>


<!-- not sure if these should be here-->
<user-name>tantan</user-name>
<password>123456</password>
<use-java-context>false</use-java-context>

<min-pool-size>10</min-pool-size>
<max-pool-size>60</max-pool-size>
<idle-timeout-minutes>15</idle-timeout-minutes>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>MSSQLXADS2005</type-mapping>
</metadata>


</xa-datasource>
</datasources>

[color=red]步骤2:[/color]
把sql server2005驱动下的 sqljdbc_xa.dll拷贝到 mssql2005安装目录下的binn目录
,登陆数据库使用查询分析器执行xa_install.sql,然后为连接数据库的用户名添加SqlJdbcXaUser角色(选中master数据库才有)


[color=red]步骤3:[/color]


运行 MS DTC 服务
在服务管理器中,MS DTC 服务应标记为“自动”,以确保其在启动 SQL Server 服务时运行。若要为 XA 事务启用 MS DTC,必须执行以下步骤:

在 Windows XP 和 Windows Server 2003 上:

在“控制面板”中,打开“管理工具”,然后打开“组件服务”。也可以单击“开始”按钮,单击“运行”,在“打开”框中键入 dcomcnfg,然后按“确定”打开“组件服务”。

展开“组件服务”、“计算机”,右键单击“我的电脑”,然后选择“属性”。

单击“MSDTC”选项卡,再单击“安全性配置”。

选中“启用 XA 事务”复选框,然后单击“确定”。这将使 MS DTC 服务重新启动。

再次单击“确定”以关闭“属性”对话框,然后关闭“组件服务”。

停止 SQL Server,然后重新启动,以确保它与 MS DTC 更改同步。

在 Windows Vista/7 上:

单击“开始”按钮,在“开始搜索”框中键入 dcomcnfg,然后按 Enter 打开“组件服务”。也可以在“开始搜索”框中键入 %windir%\system32\comexp.msc 打开“组件服务”。

依次展开“组件服务”、“计算机”、“我的电脑”和“分布式事务处理协调器”。

右键单击“本地 DTC”,再选择“属性”。

单击“本地 DTC 属性”对话框上的“安全”选项卡。

选中“启用 XA 事务”复选框,然后单击“确定”。这将使 MS DTC 服务重新启动。

再次单击“确定”以关闭“属性”对话框,然后关闭“组件服务”。

停止 SQL Server,然后重新启动,确保它与 MS DTC 更改同步。


新建servlet测试:


public class ContextConn extends HttpServlet {

/**
* Constructor of the object.
*/
public ContextConn() {
super();
}

/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

this.execute(request, response);
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


this.execute(request, response);
}


PrintWriter out =null;
public void execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
out = response.getWriter();
UserTransaction utx = null;
try {
InitialContext jndiContext= new InitialContext();
utx= (javax.transaction.UserTransaction)jndiContext.lookup("UserTransaction");
utx.begin();
testMsSql_1() ;

testMsSql_1() ;
// if(true)throw new Exception("抛出的异常测试!");



utx.commit();
}catch(Exception e){

if(utx!=null){


try {
utx.rollback();

} catch (Exception e2) {

System.out.println(e2.getMessage());
System.out.println("事物回滚失败");
}
}

out.println(e.getMessage());
}




}
public void init() throws ServletException {

}

private Connection createXAConnection(String jndiname)throws Exception{
InitialContext jndiContext;
try {
jndiContext = new InitialContext();
DataSource ds = (DataSource)jndiContext.lookup(jndiname);
return ds.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
out.print(e.getMessage()+"<br/>");
}
return null;
}

private void testMsSql_1() throws Exception {

Connection con = createXAConnection("MSSQLXADS2");
try{
if(con != null){
PreparedStatement pstmt =
con.prepareStatement("INSERT INTO xamin (colum1,colum2) VALUES (?, ?)");
pstmt.setString(1,"test");
pstmt.setString(2,"test2");
int insert= pstmt.executeUpdate();
System.out.println("测试成功"+insert+"条");
}
}catch(Exception e){
out.println(e.getMessage());
}
// if(con!=null){
// con.close();
// }
}


private void testMsSql_2() throws Exception{
Connection con = createXAConnection("MSSQLXADS");
try{
if(con != null){
PreparedStatement pstmt =
con.prepareStatement("INSERT INTO XAMin (f1,f2) VALUES (?, ?)");
pstmt.setInt(1,1);
pstmt.setString(2,"test");
int insert= pstmt.executeUpdate();
System.out.println("测试成功"+insert+"条");
}
}catch(Exception e){
out.println(e.getMessage());
}
// if(con!=null){
// con.close();
// }

}


}

总结:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值