在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?

解决方案 »

  1.   

      这是我在CSDN里发的第三个帖子了,还是没人回答,55555555555555555555555!
      

  2.   

    如果是用的服务器是WebSphere的话,必须在WebShpere上面配置好数据库连接池(不可以使用自己的)
    然后在程序当中
    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一般的用法
      

  3.   

      谢谢diy8187的回答,我用的是Jboss,我在操作一个数据库的时候没有问题,但两个就出错了。
      

  4.   

    在JBoss中配置多个数据库和数据源
      

  5.   

      我用的是pgsql数据库,在postgres-ds.xml里配置了两个数据源!
      

  6.   

       这个是我的配置:postgres-ds.xml
       <?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>
      

  7.   

    JBoss直接从JNDI中获取TransactionManager 
    ctx.lookup("java:/TransactionManager");
      

  8.   

    http://docs.jboss.org/jbossas/admindevel326/html/ch4.chapt.html
      

  9.   

    你使用的JNDI name是tomcat的   
      
    而在JBOSS下应该是   
    tx=(UserTransaction)context.lookup("java:comp/UserTransaction");  
      

  10.   

    上面更正:
    你使用的JNDI name是tomcat的       
        
    而在JBOSS下应该是       tx=(UserTransaction)context.lookup("java:/UserTransaction"); 
      

  11.   

        我把 tx = (UserTransaction) context.lookup("java:comp/UserTransaction");
        换成 tx=(UserTransaction)context.lookup("java:/UserTransaction");
        报错:
        javax.naming.NameNotFoundException: UserTransaction not bound
        这样好像找不到 UserTransaction ?
      

  12.   

    可以试下如下操作获取Context
    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");   
      

  13.   

       加上prop错误还是这样:
         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)
      

  14.   

    一个connction就可以吧,为什么要用两个呢?
      

  15.   

    一个connection怎么操作两个数据库??我还真不知道