0

私はこのような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のメソッドを保持できるように、メソッドを配列として作成しました。

4

1 に答える 1

0

わかりました。取得したデータをタスクがどのように使用するのかはまだわかりません。ただし、getConnection、getCallableStatement、およびgetMethods()関数をTableConnectionInfoのメソッドに移動します。TableConnectionInfoのコレクションを作成するだけです(既に持っているように初期化され、ArrayListに格納されます)。次に、RunnableはTableConnectionInfoを単純に繰り返します。

public class TableConnectionInfo {

    private String url;
    private String user;
    private String password;
    private String driver;
    private String suffix;
    private String sql;

private Connection connection;

<snip... getters and setters for the properties>

public Connection getConnection() {
    // TODO  create and return a connection
    if (connection == null) {
        // create the connection
    }
    return connection;
}

public CallableStatement getCallableStatement() {
    // get the callable statement
    return null;
}

public Collection<Method> getMethods() {
    // Get the Methods
    return null;
}

}

public class TableTask implements Runnable {

private Collection<TableConnectionInfo> tables;

public TableTask(Collection<TableConnectionInfo> tables) {
    this.tables = tables;
}

@Override
public void run() {
    for (TableConnectionInfo table : tables) {
        // do something with table.getConnection(), or table.getCallableStatement()
        // and/or table.getMethods()
    }
}

}
于 2013-02-16T08:52:26.103 に答える