gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:30:06 24 4
gpt4 key购买 nike

我尝试为每个数据库建立单独的连接,因为它们的 JDBC URL 不同,并将这些不同的连接存储在数组中。

在我的下面的代码中,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=用户}、table2={DRIVER=driver_name、PASSWORD=通过,URL=jdbc_url2,SUFFIX=xt2,SQL=sql2,USER=用户}}

现在这意味着我需要在运行方法中的每个线程内建立两个数据库连接,因为每个表的 JDBC url 都不同。因此,我在代码中将 Connection 创建为 list here 和 callableStatement,并且根据 tableList 大小建立连接。

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

诸如dbConnection[0]dbConnection[1]等。

对于每个表,我都调用 getRequiredMethods(suffix)。所以我也需要将其作为列表。因为如果我们有两个表,那么它将具有列表中两个表的方法。

下面是我的代码,我不确定如何在 run 方法中循环该 tableList 映射并建立新连接并将其分配为 dbConenction[0]dbConnection[1] 取决于 tableList 大小 并确保此处的所有线程安全问题。

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"));
}

}

最佳答案

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

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

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

关于java - 对不同的数据库建立不同的连接并将其放入列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14843620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com