在JTA中操作两个数据库出错,不知什么原因,在网上也没查到。
javax.transaction.UserTransaction tx = null;
java.sql.Connection conn = null;
java.sql.Connection conn2 = null;
String sql = "select * from blog";
String sql2 = "select * from person";
try {
Context context = new InitialContext();
tx = (UserTransaction) context
.lookup("java:comp/UserTransaction"); // 取得JTA事务,本例中是由Jboss容器管理
javax.sql.DataSource ds = (javax.sql.DataSource) context
.lookup("java:/PostgresDS"); // 取得数据库连接池,必须有支持XA的数据库、驱动程序
javax.sql.DataSource ds2 = (javax.sql.DataSource) context
.lookup("java:/PostgresDS2"); // 取得数据库连接池,必须有支持XA的数据库、驱动程序
tx.begin();
conn = ds.getConnection();
//conn = getJtaConnection("java:/PostgresDS2");
java.sql.Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
System.out.println("***************:" + rs.getString(2));
}
rs.close();
statement.close();
conn.close();
ds = null;
conn2 = ds2.getConnection(); //(这里出错)
java.sql.Statement statement2 = conn2.createStatement();
ResultSet rs2 = statement2.executeQuery(sql2);
while (rs2.next()) {
System.out.println("person is :" + rs2.getString(2));
}
statement2.close();
rs2.close();
conn2.close();
tx.commit();
难道在一个事务里,不能用两个Connection?
javax.transaction.UserTransaction tx = null;
java.sql.Connection conn = null;
java.sql.Connection conn2 = null;
String sql = "select * from blog";
String sql2 = "select * from person";
try {
Context context = new InitialContext();
tx = (UserTransaction) context
.lookup("java:comp/UserTransaction"); // 取得JTA事务,本例中是由Jboss容器管理
javax.sql.DataSource ds = (javax.sql.DataSource) context
.lookup("java:/PostgresDS"); // 取得数据库连接池,必须有支持XA的数据库、驱动程序
javax.sql.DataSource ds2 = (javax.sql.DataSource) context
.lookup("java:/PostgresDS2"); // 取得数据库连接池,必须有支持XA的数据库、驱动程序
tx.begin();
conn = ds.getConnection();
//conn = getJtaConnection("java:/PostgresDS2");
java.sql.Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
System.out.println("***************:" + rs.getString(2));
}
rs.close();
statement.close();
conn.close();
ds = null;
conn2 = ds2.getConnection(); //(这里出错)
java.sql.Statement statement2 = conn2.createStatement();
ResultSet rs2 = statement2.executeQuery(sql2);
while (rs2.next()) {
System.out.println("person is :" + rs2.getString(2));
}
statement2.close();
rs2.close();
conn2.close();
tx.commit();
难道在一个事务里,不能用两个Connection?
解决方案 »
- struts2 ognl 前台取复合对象值的小问题,求助
- spring与hibernate整合的时候如何在控制台上输出建表语句
- 求flex+hibernate+gilead的一个问题
- 如何把Object对象转换成泛型的.100分求解!!!!!!!!!!!!!
- struts2:<s:checkbox />取数据库中的值!
- 页面乱码问题
- 上传文件,表单提交中文变问号
- tomcat5 配置遇到问题。郁闷,急!!!!
- jsp中import变量的用法
- 如何解决文件下载和页面迁移之间的矛盾
- 【100分】网站在本机调试可以,为什么传到空间服务商那就不行了,谁来帮帮我?????????????????????????
- lucene索引文件可以修改吗?
然后在程序当中
Context ctx = new InitialContext();
UserTransaction trans = (UserTransaction)ctx.lookup("java:comp/UserTransaction
trans.begin();然后再
DataSource ds = (DataSource)ctx.lookup(jndiNameOfDataSource);
Connection conn = ds.getConnection();
在中间不需要setAutoCommit,也不需要commit rollbackDataSource ds2 = (DataSource)ctx.lookup(jndiNameOfDataSource);
Connection conn2 = ds.getConnection();最后trans.commit()或者rollback就可以了这个是J2EE一般的用法
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>PostgresDS</jndi-name>
<connection-url>jdbc:postgresql://localhost:5432/jta1</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<user-name>postgres</user-name>
<password>wwx1226</password>
<idle-timeout-minutes>50</idle-timeout-minutes>
<metadata>
<type-mapping>PostgreSQL 8.2-506</type-mapping>
</metadata>
</local-tx-datasource>
<local-tx-datasource>
<jndi-name>PostgresDS2</jndi-name>
<connection-url>jdbc:postgresql://localhost:5432/jta2</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<user-name>postgres</user-name>
<password>wwx1226</password>
<idle-timeout-minutes>50</idle-timeout-minutes>
<metadata>
<type-mapping>PostgreSQL 8.2-506</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
ctx.lookup("java:/TransactionManager");
而在JBOSS下应该是
tx=(UserTransaction)context.lookup("java:comp/UserTransaction");
你使用的JNDI name是tomcat的
而在JBOSS下应该是 tx=(UserTransaction)context.lookup("java:/UserTransaction");
换成 tx=(UserTransaction)context.lookup("java:/UserTransaction");
报错:
javax.naming.NameNotFoundException: UserTransaction not bound
这样好像找不到 UserTransaction ?
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
prop.put(Context.PROVIDER_URL, "localhost:1099");
prop.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
org.jboss.util.NestedSQLException: Could not enlist in transaction on entering meta-awareobject!;
- nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: -3f570278:702:475de3c1:3f status: ActionStatus.ABORT_ONLY >);
- nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!;
- nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: -3f570278:702:475de3c1:3f status: ActionStatus.ABORT_ONLY >))
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:94)