2つの列があるデータベースに挿入する必要があります-
ID Primary Key String
Data String
つまり、IDは毎回一意である必要があります。そうでない場合、duplicate row in unique index
挿入中に例外がスローされます。そして、私はこの範囲の間でIDを選択する必要があります1-100000
つまり、各スレッドは常に一意のIDを使用する必要があります-
以下は私が書いたマルチスレッドプログラムで、から取得した後は毎回異なる一意のIDでデータベースに挿入されますArrayBlockingQueue
。
それで、このプログラムはスレッドセーフになるかどうか?または、スレッドごとに毎回一意のIDを取得する他のより良い方法はありますか?または、以下のプログラムが原因である可能性がありduplicate row in unique index
ますか?
private static LinkedList<Integer> availableExistingIds = new LinkedList<Integer>();
public static void main(String[] args) {
for (int i = 1; i <= 100000; i++) {
availableExistingIds.add(i);
}
BlockingQueue<Integer> pool = new ArrayBlockingQueue<Integer>(200000, false, availableExistingIds);
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < noOfTasks * noOfThreads; i++) {
service.submit(new ThreadTask(pool));
}
}
class ThreadTask implements Runnable {
private BlockingQueue<Integer> pool;
private int id;
public ThreadTask(BlockingQueue<Integer> pool) {
this.pool = pool;
}
@Override
public void run() {
try {
dbConnection = getDBConnection();
preparedStatement = dbConnection.prepareStatement(INSERT_SQL);
id = pool.take();
preparedStatement.setString(1, String.valueOf(id));
preparedStatement.setString(2, ACCOUNT);
preparedStatement.executeUpdate();
} finally {
pool.offer(id);
}
}
}