MySQL和Java - 对多个数据库重复操作

时间:2015-06-25 09:31:07

标签: java mysql database database-connection

我有一个Java程序,它在数据库上执行一些搜索操作,这是代码:

public class DBSearch {

    public static void SearchDatabase() throws Exception{
      ArrayList<String> names = new ArrayList<String>();
      Connection c = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      String host = "localhost";
      String db = "mydatabase";
      String user = "root";
      String password = "password";
  Class.forName("com.mysql.jdbc.Driver");
  c = DriverManager.getConnection("jdbc:mysql://"+host+"/" + db +"?user="+user+"&password="+password);
        ps = c.prepareStatement("SELECT NAME FROM NAMES");
        rs = ps.executeQuery();
        names.clear()
   while ( rs.next() ) {
        names.add(rs.getString("NAME"));
    }
        for(i = 1; i < names.size(); i++){
        //Do some database operations

现在我想做的是,在这些操作结束时,进程开始在另一个数据库中进行相同的操作。我的想法是创建一个名为dblist的ArrayList,其中包含所有数据库名称,然后执行以下操作:

...
for(i=1, i < dblist.size(); i++{
      Class.forName("com.mysql.jdbc.Driver");
      c = DriverManager.getConnection("jdbc:mysql://"+host+"/" + dblist.get(i) +"?user="+user+"&password="+password);

但是这个过程似乎不是为每个数据库循环,它只与数组中的第一个数据库一起使用而不是停止。

2 个答案:

答案 0 :(得分:1)

你收到什么消息?没有人可以根据您发布的内容提供帮助。

这是一个丑陋,低效的代码。

我会提供一些建议:

  1. 外部数据库配置。重用会更容易。您还可以利用连接池。
  2. 将操作封装在您可以轻松测试的基于接口的POJO中。
  3. 此问题很容易并行化。一旦您的POJO运行并经过测试,您就可以使用Callable来使用可执行文件一次查询许多数据库。
  4. 听起来像一个糟糕的设计。为什么要将冗余数据分散在许多数据库中?

答案 1 :(得分:0)

不要将变量放在for循环的外部,而是将其放在里面。因此,它每次都会创建一个新连接。

同时检查您是否从dblist获取了正确的数据库信息。事实上,确保您甚至获取数据库信息,而不是在for循环中运行相同的连接。

实施例。 请注意,我在for循环中使用0,因为数组列表中的第一个索引是0。

for(i=0, i < dblist.size(); i++
{
    dblist.get(i);
    //Separate the string you got from the ArrayList into host, user, pass and assign correct variables
    Class.forName("com.mysql.jdbc.Driver");
    //Variables you got from the list go in the next statement
    Connection c = DriverManager.getConnection("jdbc:mysql://"+host+"/" + db +"?user="+user+"&password="+password);
}

不是我在Connection中没有我的get语句(我假设你的ArrayList包含主机,数据库,用户和传递)

或者你可以将整个连接字符串存储在Array列表中,它只是:

Connection c = DriverManager.getConnection(dblist.get(i));