jboss5 jta事物配置

本文介绍如何在JBoss应用服务器环境下配置MS SQL Server 2005数据库以支持XA事务处理,包括配置JNDI数据源、安装SQL Server驱动、设置MSDTC服务等内容。
需求:
现有数据库 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();
// }

}


}

总结:
(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值