http://gniboul.blog.163.com/blog/static/1685616022013223102657774/
Jboss 7 不再支持remote 的 lookup 所以要用web 应用测试。
1.在%JBOSS_HOME%下的modules里 建目录 /com/oracle/ojdbc6/main,
放入ojdbc6.jar 并创建 module.xml
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.oracle.ojdbc6">
<resources>
<resource-root path="ojdbc6.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/> <!--别忘了-->
</dependencies>
</module>
注意如果oracle版本>11 ,不要用 ojdbc14 不然会包 failed with exception $XAException.XAER_NOTA 异常。
2.修改standalone/configuration下的standalone.xml,在<datasources></datasources>里加两个 xa数据源
以及在<drivers></drivers>里加一个一个driver,driver 的name就是在module
<xa-datasource jndi-name="java:/XAOracleDS01" pool-name="XAOracleDS01" use-java-context="false">
<xa-datasource-property name="URL">
jdbc:oracle:thin:@//192.168.2.234:1521/ltdb
</xa-datasource-property>
<xa-datasource-property name="User">
im_fj
</xa-datasource-property>
<xa-datasource-property name="Password">
im_fj
</xa-datasource-property>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<driver>oracle</driver>
<xa-pool>
<is-same-rm-override>false</is-same-rm-override>
<no-tx-separate-pools>true</no-tx-separate-pools>
</xa-pool>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
</xa-datasource>
<xa-datasource jndi-name="java:/XAOracleDS02" pool-name="XAOracleDS02" use-java-context="false">
<xa-datasource-property name="URL">
jdbc:oracle:thin:@//192.168.2.234:1521/ltdb
</xa-datasource-property>
<xa-datasource-property name="User">
im_sd
</xa-datasource-property>
<xa-datasource-property name="Password">
im_sd
</xa-datasource-property>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<driver>oracle</driver>
<xa-pool>
<is-same-rm-override>false</is-same-rm-override>
<no-tx-separate-pools>true</no-tx-separate-pools>
</xa-pool>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
</xa-datasource>
<drivers>
<driver name="oracle" module="com.oracle.ojdbc6">
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
</driver>
</drivers>
3. eclipse安装jbosstool 后,new 一个 jboss 7 的server (目录就是 %JBOSS_HOME% 拉).
能正常启动。并确定加载了数据源(可以在 管理端口 localhost:9990 看到数据源, 或者在启动日志里找到)。
4.创建一个web工程, 建一个UserTransactionServlet .
package XATest;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
public class UserTransactionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Properties env = new Properties();
// env.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
// env.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
// env.setProperty("java.naming.provider.url", "jnp://localhost:9999");
Context ctx=null;
try {
ctx = new InitialContext(env);
System.out.println("111111111111111111111");
UserTransaction utx = (javax.transaction.UserTransaction) ctx.lookup(" java:jboss/UserTransaction");
DataSource ds01 = (javax.sql.DataSource) ctx.lookup("java:/XAOracleDS01");
DataSource ds02 = (javax.sql.DataSource) ctx.lookup("java:/XAOracleDS02");
utx.begin();
Connection cn1 = ds01.getConnection();
Connection cn2 = ds02.getConnection();
cn1.createStatement().execute("insert into a_user_tables (table_name) values('ccc')");
cn2.createStatement().execute("insert into a_user_tables (table_name) values('ccc')");
//模拟抛出一个业务异常
utx.commit();
cn1.close();
cn2.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
该项目还应该加载了 j2ee liberary, ojebc6.jar, %JBOSS_HOME%/bin/client/jboss-client.jar。
ok ,可以debug on server 测试了