1

JDBC URL'sデータベースごとに異なる接続を作成し、それらの異なる接続を配列に格納しようとしています。

以下のコードでtableListは、テーブル名とプロパティを含むマップであり、次のようになります。

 ConcurrentHashMap<String, ConcurrentHashMap<String, String>> tableList

サンプル例-

{table1={DRIVER=oracle.jdbc.driver.OracleDriver, PASSWORD=stage_cs_user, URL=jdbc_url, SUFFIX=xt1, SQL=sql, USER=user}, table2={DRIVER=driver_name, PASSWORD=pass, URL=jdbc_url2, SUFFIX=xt2, SQL=sql2, USER=user}}

each threadつまり、JDBCのURLはテーブルごとに異なるため、runメソッド内で2つのデータベース接続を確立する必要があります。だから私はここのリストとcallableStatementとして私のコードでConnectionを作成しました、そしてtableListのサイズに応じてそれは接続を作成します。

テーブルが1つしかない場合は、接続が1つだけになり、テーブルが2つある場合は、接続が2つになります。

などのようなものdbConnection[0]dbConnection[1]

そして、テーブルごとに、私はと呼んでいgetRequiredMethods(suffix)ます。だから私もこれをリストとして作る必要があります。2つのテーブルがある場合、リストに2つのテーブルのメソッドがあるためです。

以下は私のコードですが、runメソッドでそのマップをループし、新しい接続を作成して、に応じてtableList割り当てる方法と、ここですべてのスレッドセーフの問題を確認する方法はわかりません。dbConenction[0]dbConnection[1]tableList size

class Task implements Runnable {

    private Connection[] dbConnection = null;
    private CallableStatement[] callableStatement = null;


    public Task(ConcurrentHashMap<String, ConcurrentHashMap<String, String>> tableList) {
        this.tableLists = tableList;
    }

    @Override
    public void run() {

        try {

            for(loop around lableList map) {

 /* Make a connection to database and assign it as dbConnection[0], 
   dbConnection[1] and callableStatement[0] etc.
  */        
            dbConnection = getDBConnection(url, username, password, driver);
            callableStatement = dbConnection.prepareCall(sql);

            ArrayList<Method> methods = getRequiredMethods(suffix);
            }

        }   

    }

    private ArrayList<Method> getRequiredMethods(String suffix) {

        Class<ConstantsTest> consClass = ConstantsTest.class;
        Method[] methods = consClass.getDeclaredMethods();
        ArrayList<Method> requiredMethods = new ArrayList<Method>();
        for (int i = 0; i < methods.length; i++) {
            String sName = methods[i].getName();
            if (sName.endsWith(suffix)) {
                requiredMethods.add(methods[i]);
            }
        }
        return requiredMethods;
    }

誰かがここで私を助けることができますか?

更新されたコード:-

私はここでいくつかの進歩を遂げました-私は自分のrunメソッドで以下のコードを書きました-

public void run() {

        ArrayList<Method> methods[];

        for( int i=0; i<tableLists.size(); i++) {

            dbConnection[i] = getDBConnection(tableLists.get(i).get("URL"), tableLists.get(i).get("USERNAME"), tableLists.get(i).get("PASSWORD"), tableLists.get(i).get("DRIVER"));
            callableStatement[i] = dbConnection[i].prepareCall(tableLists.get(i).get("SQL"));

            methods[i] = getRequiredMethods(tableLists.get(i).get("SUFFIX"));
        }

}
4

1 に答える 1

2

複数のスレッドを使用していて、各スレッドが2つの別々のデータベース接続にアクセスできる必要があるようです。

これに対処する通常の方法は、独自のコードを作成するのではなく、接続プールを使用することです。実際のデータベースソケットの基になるセットは、いくつかのコードによって管理され、閉じてプールに戻すことができるそれらへの軽量参照を取得するだけです。 。このために私がお勧めする2つのJavaパッケージは、BoneCPC3P0です。次に、データベース1とデータベース2の接続プールを作成します。

このように、各スレッドは、プール1またはプール2(必要なデータベースに応じて)からの接続を要求し、実行したいことをすべて実行し、完了したら接続を要求するだけで済みますclose()。プールは、負荷に応じて実際のソケットの数を自動的に作成し、スレッド間のすべての同期を管理します。

于 2013-02-13T00:01:06.223 に答える