0

实际上我需要连接在我的应用程序服务器中创建的两个mysql数据源。我正在使用JPA2.0

我尝试了以下代码。但我收到异常“ java.lang.IllegalStateException:本地事务已经有 1 个非 XA 资源:无法添加更多资源。 ”。

import com.google.common.collect.Lists;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import javax.annotation.Resource;
import javax.sql.DataSource;


public class SampleClass {

@Resource(name = "jdbc/source1")
DataSource source1;

@Resource(name = "jdbc/source2")
DataSource source2;

final List<String> list = Lists.newArrayList("Source1", "Source2");

public void getresponse() throws Exception {

    for (String source : list) {
        Connection connection = null;
        Statement statement = null;
        try {
            connection = getConnection(source);
            statement = connection.createStatement();
        } catch (SQLException ex) {
        } finally {
            statement.close();
            connection.close();
        }
    }
}

public Connection getConnection(String source) {
    Connection conn = null;
    try {
    if(source.equalsIgnoreCase("Source1")){
        conn = source1.getConnection();
    } else if(source.equalsIgnoreCase("Source2")){
        conn = source2.getConnection();
    }
    } catch(SQLException se) {

    }

    return conn;
 }
}

对于我在代码中的逻辑。我需要使用单个 Connection 对象连接所有数据源

如何关闭现有连接 ( conn ) 对象并连接下一个数据源?

4

1 回答 1

2

根据您的需要,您可以在其中一个数据源上启用“非事务连接”,或者您必须在两个数据源上都使用 XA 数据源。

要在 Glassfish 3 管理员中启用“非事务连接”,请导航到 JDBC -> JDBC 连接池 -> YourPoolYouWantToEbleNontransactional,然后单击事务部分下的启用复选框。请注意非事务性连接意味着什么。

您还可以使用本质上实现两阶段提交的 XA 数据源驱动程序。谷歌告诉我数据源类名是 'com.mysql.jdbc.jdbc2.optional.MysqlXADataSource' 但我不知道它是否分布在标准的 mysql jdbc 分布中。

于 2013-02-21T22:22:42.830 回答