私はこのようなHashMapを持っています-
HashMap<String, TableConnectionInfo> tableList
つまり、その値は次のTableConnectionInfo
ようなクラスです-
public class TableConnectionInfo {
public String url;
public String user;
public String password;
public String driver;
public String suffix;
public String sql;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
}
したがって、上記に2つの値があるとしますHashMap
。つまり、2つの異なるデータベースに2つの異なる接続を確立する必要があります。そして、そのマップに3つの値がある場合、3つの異なるデータベースに3つの異なる接続を確立する必要があるとします。
メインスレッドでは、このようにプロパティファイルから上記のマップを読み取ってデータを入力していますが、その後、このマップは変更されません。
for (String arg : databaseNames) {
TableConnectionInfo ci = new TableConnectionInfo();
String url = prop.getProperty(arg + ".url");
String user = prop.getProperty(arg + ".user");
String password = prop.getProperty(arg + ".password");
String driver = prop.getProperty(arg + ".driver");
String suffix = prop.getProperty(arg + ".suffix");
String sql = prop.getProperty(arg + ".sql");
ci.setUrl(url);
ci.setDriver(driver);
ci.setPassword(password);
ci.setSql(sql);
ci.setSuffix(suffix);
ci.setUser(user);
tableList.put(arg, ci);
}
現在、このマップをこのようなさまざまなスレッドに渡してtableList
いますが、どのスレッドによっても(set呼び出しを行うことによって)変更されることはありません。各スレッドはgetメソッドを使用して必要なメソッドを取得します。
for (int i = 0; i< 1000; i++) {
service.submit(new Task(tableList));
}
したがって、runメソッドでは、サイズに基づいてさまざまな接続を作成する必要がありtableList
ます。したがって、tableList
サイズが2の場合、2つの異なるデータベースへの2つの異なる接続(callableStatementsとメソッド)を作成する必要があることを意味します。
質問:-
run method
それで、データベースへの異なる接続を作成するために私が行っている方法と比較して、より良い方法はありますtableList size
か?
以下は、RunnableInterfaceを実装する私のタスククラスです
class Task implements Runnable {
private Connection[] dbConnection = null;
private CallableStatement[] callableStatement = null;
private ArrayList<Method> methods[] = null;
private final HashMap<String, TableConnectionInfo> tableLists;
public Task(HashMap<String, TableConnectionInfo> tableList) {
this.tableLists = tableList;
}
@Override
public void run() {
try {
int j = 0;
dbConnection = new Connection[tableLists.size()];
callableStatement = new CallableStatement[tableLists.size()];
methods = new ArrayList[tableLists.size()];
for (TableConnectionInfo ci : tableLists.values()) {
dbConnection[j] = getDBConnection(ci.getUrl(), ci.getUser(), ci.getPassword(), ci.getDriver());
callableStatement[j] = dbConnection[j].prepareCall(ci.getSql());
methods[j] = getRequiredMethods(ci.getSuffix());
j++;
}
}
}
}
そのデータベースに接続します-
private Connection getDBConnection(String url, String username, String password, String driver) {
Connection dbConnection = null;
try {
Class.forName(driver);
dbConnection = DriverManager.getConnection(url, username, password);
}
return dbConnection;
}
ここに追加するだけgetRequiredMethods
で、特定のテーブルのすべてのmethodNameが取得されます。したがって、tableListのサイズが1の場合、そのデータベースへの接続は1つだけなので、そのgetRequiredMethods
すべてのメソッドを取得しtable1
てArrayListに格納するとします。ただし、tableListのサイズが2の場合、2つの異なるデータベースへの2つの異なる接続があると仮定します。そのため、テーブル1のメソッドとテーブル2のメソッドを保持できるように、メソッドを配列として作成しました。