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 都不同。所以我在我的代码中将 Connection 设置为 list 和 callableStatement ,并且根据 tableList 的大小,它将建立连接。

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

dbConnection[0]之类的东西dbConnection[1]

对于每张桌子,我都在打电话getRequiredMethods(suffix)。所以我也需要把它作为清单。因为如果我们有两个表,那么列表中就会有两个表的方法。

下面是我的代码,我不确定如何tableList在 run 方法中循环该映射并建立新连接并将其分配为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;
    }

有谁可以帮我离开这里吗?

更新代码:-

我在这里取得了一些进展-我在运行方法中编写了以下代码-

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

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

处理这个问题的常用方法不是编写自己的代码,而是使用连接池:一组底层的实际数据库套接字由一些代码管理,您只需获得对它们的轻量级引用,这些引用可以关闭并返回到池中. 我为此推荐的两个 java 包是BoneCPC3P0。然后,您将为数据库 1 和数据库 2 创建一个连接池。

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

于 2013-02-13T00:01:06.223 回答