建立与不同数据库的不同连接并将其放入列表中

时间:2013-02-12 23:13:05

标签: java multithreading concurrency thread-safety concurrenthashmap

我正在尝试为每个数据库建立单独的连接,因为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}}

现在这意味着我需要在run方法中在each thread内建立两个数据库连接,因为每个表的JDBC url都不同。所以我在我的代码中将Connection作为列表和callableStatement,并且取决于tableList大小,它将建立连接。

如果我们只有一个表,那么它只会产生一个连接,如果我们有两个表,那么它将建立两个连接。

dbConnection[0]dbConnection[1]

对于每张桌子,我打电话给getRequiredMethods(suffix)。所以我需要把它作为列表。因为如果我们有两个表,那么它将为列表中的两个表提供方法。

以下是我的代码,我不确定,如何在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"));
        }

}

1 个答案:

答案 0 :(得分:2)

听起来您正在使用多个线程,并且每个线程必须能够访问两个单独的数据库连接。

处理这个问题的常用方法不是编写自己的代码,而是使用连接池:一些基本的实际数据库套接字由一些代码管理,你只需要对它们进行轻量级引用即可关闭并返回到游泳池。我建议的两个java包是BoneCPC3P0。然后,您将为数据库1和数据库2创建连接池。

这样,每个线程只需要从池1或池2请求连接(取决于它需要的数据库),做它想做的任何事情,然后在完成后close()连接。该池将根据负载自动创建许多实际套接字,并将为您管理线程之间的所有同步。