マルチスレッド Java プログラムで DB に多くのレコードを挿入しています。
メインスレッドはすべてのスレッドを作成し、それらが完了するのを待ちます。
for(int i = 0; i < noOfThreads; i++) {
results.add(exec.submit(new InsertConnection()) );
Thread.sleep(1000);
}
for(Future<?> fs : results) {
try {
// This will wait till each thread is done
fs.get();
} catch (Exception e) {
logger.error(null, e);
}
}
各スレッドは DB 接続で動作し、レコードを DB に挿入します。接続オブジェクトはスレッド間で共有されません。このようなもの
public class InsertConnection implements Runnable{
public InsertConnection() {
//create connection object
}
@Override
public void run() {
while(true)
//Fetch a betch
//Insert ina loop
}
}
}
プログラムが終了する直前に、接続が閉じられているため、いくつかのスレッド (2、4、6) が挿入に失敗していることがわかります。1つのスレッドが仕事を終えると、ソケットは何らかの形で閉じられると思います。以下は例外です
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Software caused connection abort: recv failed
STACKTRACE:
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1994)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:882)
at com.mysql.jdbc.CallableStatement.execute(CallableStatement.java:759)
at mind.fire.connection.store.InsertConnection.execute(InsertConnection.java:81)
at mind.fire.connection.store.InsertConnection.run(InsertConnection.java:62)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
** END NESTED EXCEPTION **