我已经开始研究一个项目,其中我在不同的数据库中有两个具有不同模式的表。所以我将有两个不同的连接参数来连接到数据库。并且在连接到每个数据库之后,我需要使用相应表中给出的 sql 在这两个表中插入。
我应该根据命令行参数使用 JDBC 插入所有两个表或其中任何一个表。这意味着单个线程将插入 Table1 和 Table2 或其中任何一个。
命令行参数:- 这里 10 是线程数,100 是任务数,table1 和 table2 是表名。
10 100 table1 table2
下面是我的代码。在这段代码中会发生什么 - 假设如果我们只传递一个名为 的表table1
,那么它将使用用于 table1 的 SQL 插入到该表中。
而且我还需要id
在两者中插入相同的内容table1
,table2
并且将id
其传递AtomicInteger
给 Constructor Task
。所以这意味着如果id is 1
,那么这1 id
应该在table1
和中都有table2
。
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));
}
}
下面是实现Runnable接口的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 as10
和 Number of Tasks as1000
并且id
如果我选择 as 1
。
然后在两个表中相同的 id 不存在,这意味着 id 1 将只存在于一个表中table1
or table2
。我能想到的唯一原因是 -id
每次AtomicInteger
它都会id
为每个线程获得一个新的。有什么方法可以使用相同的 id 在每个表中插入?然后确保 id 是PrimaryKey
这样,如果每个线程在这些表中再次插入,它将获得一个新的 id。