Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过检查映射大小,将不同的连接连接到不同的数据库_Java_Database_Multithreading - Fatal编程技术网

Java 通过检查映射大小,将不同的连接连接到不同的数据库

Java 通过检查映射大小,将不同的连接连接到不同的数据库,java,database,multithreading,Java,Database,Multithreading,我有一个类似这样的HashMap- HashMap<String, TableConnectionInfo> tableList public class TableConnectionInfo { public String url; public String user; public String password; public String driver; public String suffix; public Str

我有一个类似这样的HashMap-

 HashMap<String, TableConnectionInfo> tableList
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;
    }

}
因此,假设我在上面的
HashMap
中有两个值。这意味着,我需要对两个不同的数据库建立两个不同的连接。假设该映射有三个值,那么我需要对三个不同的数据库建立三个不同的连接

在主线程中,我通过像这样从属性文件中读取来填充上面的映射,之后该映射将不会被修改

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));
}
建立到该数据库的连接-

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
即可获得特定表的所有方法名。因此,假设tableList大小为1,那么我们将只有一个到该数据库的连接,因此
getRequiredMethods
将获取该
table1
的所有方法,并将其存储在ArrayList中。但是假设tableList的大小是2,那么我们将有两个不同的连接到两个不同的数据库,这就是为什么我将方法作为一个数组,这样它就可以保存表1的方法和表2的方法。

好的,我仍然不确定任务是如何使用它获得的数据的。但是,我会将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()
    }
}

}
公共类TableConnectionInfo{
私有字符串url;
私有字符串用户;
私有字符串密码;
私有字符串驱动程序;
私有字符串后缀;
私有字符串sql;
专用连接;
公共连接getConnection(){
//TODO创建并返回连接
if(连接==null){
//创建连接
}
回路连接;
}
公共CallableStatement getCallableStatement(){
//获取可调用语句
返回null;
}
公共集合getMethods(){
//获取方法
返回null;
}
}
公共类TableTask实现可运行{
私人收藏桌;
公共表任务(集合表){
这个表=表;
}
@凌驾
公开募捐{
for(TableConnectionInfo表格:表格){
//对table.getConnection()或table.getCallableStatement()执行某些操作
//和/或table.getMethods()
}
}
}

您可以将TableConnectionInfo作为映射的键(在TableConnectionInfo中实现hashCode之后),映射的值将是从数据库检索的方法。这样就不会混淆这些方法的来源。我还可能让每个线程只处理一个TableConnectionInfo。上面所说的并不是真正的多线程处理……而是添加一个按顺序遍历TableConnectionInfo对象的Runnable。如果您的runnable获取单个TableConnectintInfo并返回方法,那么它就不需要知道映射。然后,控制代码可以使用threadPoolExecutor,在需要时分发TableConnectionInfo对象,并在线程完成时将该方法放入映射中。有些表有10个方法,有些表有20个方法。您可以用逻辑在单独的Java类中提取这些方法吗。然后,在创建TableConnectionInfo对象时,它有一个负责检索方法的对象。这取决于tableConnectionInfo对象的创建方式。用于从表中提取方法的逻辑被封装在检索它的逻辑之外。这与线程调用的TableConnectionInfo.getMethods()类似。它不知道也不关心这些方法是如何填充的,或者有多少。只是它返回了一个方法集合(或字符串,或任何它想要返回的关于方法的集合)。但是使用这种方法,它将如何确保此连接适用于此表?这些方法是针对这张桌子的?我不知道。能否在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()
    }
}

}