在多线程代码中的两个表中存储相同的ID



我已经开始着手一个项目,在这个项目中,我在不同的数据库中有两个具有不同模式的表。因此,我将使用两个不同的连接参数来连接到数据库。在连接到每个数据库后,我需要使用相应表中给出的sql插入这两个表。

我应该根据命令行参数使用JDBC插入所有两个表或其中任何一个表。因此,这意味着将有一个线程插入表1和表2或它们中的任何一个。

命令行参数:-这里10是线程数,100是任务数,表1和表2是表名。

10 100 table1 table2

下面是我的代码。在这段代码中,假设我们只传递一个名为table1的表,那么它将使用表1的SQL插入该表。

此外,我还需要在table1table2中插入相同的id,并且id作为AtomicInteger传递给构造函数Task。这意味着如果id is 1,那么这个1 id应该同时存在于table1table2中。

 final AtomicInteger id = new AtomicInteger(1);
 ExecutorService service = Executors. newFixedThreadPool(noOfThreads);
 for (int i = 0; i < noOfTasks * noOfThreads; i++) {
      for (String arg : tableNames) {
          String url = (String) prop.get(arg + ".url");
          String user = (String) prop.get(arg + ".user");
          String password = (String) prop.get(arg + ".password");
          String driver = (String) prop.get(arg + ".driver");
          String suffix = (String) prop.get(arg + ".suffix");
          String sql = (String) prop.get(arg + ".sql");
          service.submit( new Task(id, url, user, password, driver, sql, suffix));
        }
    }

下面是实现可运行接口的Task类

class Task implements Runnable {
    private final AtomicInteger id ;
    private final String url ;
    private final String username ;
    private final String password ;
    private final String sql ;
    private final String driver ;
    private final String suffix ;
    public Task(AtomicInteger id, String url, String user, String password, String driver, String sql, String suffix) {
        this.id = id;
        this.url = url;
        this.username = user;
        this.password = password;
        this.driver = driver;
        this.sql = sql;
        this.suffix = suffix;
    }
    @Override
    public void run() {
        try {
           dbConnection = getDBConnection(url , username , password , driver );
           callableStatement = dbConnection .prepareCall(sql);
           int userId = id .getAndIncrement();
           callableStatement.setString(1, String.valueOf(userId));
        //other callableStatement

        callableStatement.executeUpdate();
       }
    }

因此,如果我使用多个线程运行上述程序,如Number of threads为10,Number of Task为1000id(如果我选择为1)。

那么在两个表中都不存在相同的id,这意味着id 1将只存在于table1table2中的一个表中。我能想到的唯一原因是-idAtomicInteger,所以每次它都会为每个线程获得一个新的id。有什么方法可以使用相同的id插入每个表中吗?然后确保id是PrimaryKey,这样每个线程在再次插入这些表时都会得到一个新的id。

如果我理解正确,您应该将计数器定义为静态,以避免重复PrimaryKey:

static AtomicInteger id;

然后像这样将增量代码移动到主循环(不要忘记删除Task类中的int userId = id .getAndIncrement();):

for (int i = 0; i < noOfTasks * noOfThreads; i++) {
  // add following line
  int userId = id.getAndIncrement();
  for (String arg : tableNames) {
      String url = (String) prop.get(arg + ".url");
      String user = (String) prop.get(arg + ".user");
      String password = (String) prop.get(arg + ".password");
      String driver = (String) prop.get(arg + ".driver");
      String suffix = (String) prop.get(arg + ".suffix");
      String sql = (String) prop.get(arg + ".sql");
      service.submit( new Task(id, url, user, password, driver, sql, suffix));
    }
}

此外,由于id计数器保存在内存中,您可能需要将其持久化,否则在重新启动应用程序后,它将重置为0。

相关内容

  • 没有找到相关文章

最新更新