0

実際には、アプリケーションサーバーで作成された2つの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」に移動し、「トランザクション」セクションの下の「有効」チェック・ボックスをクリックします。接続が非トランザクションであるとはどういう意味かを知っておいてください。

基本的に2フェーズコミットを実装するXAデータソースドライバーを使用することもできます。Googleによると、データソースのクラス名は「com.mysql.jdbc.jdbc2.optional.MysqlXADataSource」ですが、標準のmysqljdbcディストリビューションで配布されているかどうかはわかりません。

于 2013-02-21T22:22:42.830 に答える