ここには、2つのスレッドプールを作成するかなり単純なJavaクラスがあります。
実行中のURLストリームに接続し、エントリを1行ずつ読み込み、各エントリをバックエンドのMySQLDBに送信します。
それぞれが同じプロセスを実行する複数のスレッドを生成します(以下)。
1.上から最も古いDBエントリを取得します
2.それに応じて解析および処理します
3.いくつかのセクションを別のDBテーブルに保存します
4.実行中のテーブルからこのDBエントリを削除して、分析が完了したことを示します
5.エンドスレッド
2つのプールが必要な理由は、読み取りプロセスが分析よりもはるかに高速であり、エントリを通過するときに各エントリを読み取って分析すると、バックアップが速すぎて着信ストリームが中断するためです。この分離を行うことにより、読み取りは必要な速度で実行でき、分析は、追いつくレコードが安全で追いつくことができることを知っている限り速く進むことができます。
私が抱えている問題は、各並行スレッドが同じ最も古いレコードを取得していることです。個別のスレッドがすべて同時に実行され、それぞれが一意の最も古いDBエントリにアクセスするようにするための最善の方法を知る必要があります。
前もって感謝します。
編集=================================
これまでの返信に感謝します...
私がここで試みていた現在のセットアップをさらに拡張するには、おそらくこのコードセグメントが役立つでしょう...
try
{
String strQuery1 = "SELECT lineID,line FROM lineProcessing ORDER BY lineID ASC LIMIT 1;";
String strQuery2 = "DELETE from lineProcessing WHERE lineID = ?";
DBConnector dbc = new DBConnector(driver,url,userName,passwd);
Connection con = dbc.getConnection();
con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement(strQuery1);
rs = pstmt.executeQuery();
//Now extract the line & Id from the returned result set
while (rs.next()) {
lineID = Integer.parseInt(rs.getString(1));
line = rs.getString(2);
} //end while
//Now delete that entry so that it cannot be analysed again...
pstmt = con.prepareStatement(strQuery2);
pstmt.setString(1, lineID.toString());
int res=pstmt.executeUpdate();
con.commit();
con.setAutoCommit(true);
con.close();
}
catch (SQLException e) {
System.out.println(">>>EXCEPTION FOUND IN QUERY = " + strQuery1 + " __or__ " + strQuery2);
e.printStackTrace();
}
...基本的にDB接続を開き、「Autocommit = false」に設定して、QUERY1を実行し、QUERY2を実行し、両方のトランザクションをコミットして、最終的に接続を閉じます。これは、個々のスレッドが完了するために必要なすべてである必要があります。問題は、分析スレッドプールで実行している各Xスレッドがすべて生成され、このコードのバッチを同時に実行することです(これは予想どおりです)が、設定したDBへの単一の接続アクセスを尊重しませんその上。その後、それらはすべて、分析のために同じ行で戻ります。スレッドが次の反復#2でループするとき、それらはすべて、前の削除に続く分析のためにこの新しい最後の行を返します。
さらに提案がありますか?Javaを介した強制トランザクションSQLの良い例を含めてください。
皆さん、ありがとうございました。