ある種の「facebook like」機能を備えたアプリケーションを開発しています。ユーザーが公開したコンテンツが「いいね」されるたびに、句読点が増えます。このアプリは社内の多数のユーザーが使用するため、同じ行への多数の同時更新が予想されます。
簡略化されたコード
ユーザー句読点表
Punctuation(
userId NVARCHAR2(32),
value NUMBER(10,0)
)/
Java コード
public class Punctuation(){
private String userId;
private int value;
public Punctuation(final String userId, final int value){
this.userId = userId;
this.value = value;
}
public String getUserId();
public int getValue();
}
//simplified code
public final class PunctuationController{
private PunctuationController(){}
public static void addPunctuation(final Punctuation punctuation){
final Transaction transaction = TransactionFactory.createTransaction();
Connection conn = null;
PreparedStatment statment = null;
try{
synchronized(punctuation){
transaction.begin();
conn = transaction.getConnection();
statment = conn.preparedStatment("UPDATE Punctuation SET value = value + ? where userId = ?");
statment.setString('1', punctuation.getUserId());
statment.setInt('2', punctuation.getValue());
transaction.commit();
}
}catch (Exception e){
transaction.rollback();
}finally{
transaction.dispose();
if(statment !=null){
statment.close();
}
}
}
更新中のデッドロックを恐れています。Oracle では、単一のクエリで合計を作成できます。値を取得して、新しい値で更新するために 2 番目のクエリを作成する必要はありません。これは良いことです。また、ここで他の投稿を読んでいると、同期ブロックを作成してオブジェクトをロックし、Java に異なるスレッド間の同期を処理させるように言われました。メソッドが受け取る句読点インスタンスを選択します。このようにして、ユーザーと値のさまざまな組み合わせがこのメソッドへの同時アクセスを許可すると想像しますが、同じ値を持つインスタンスをブロックします (句読点に equals() を実装する必要がありますか?
)データベースは、Oracle 10g、Server Weblogic 11g、Java 6、および Linux です (どのフレーバーかはわかりません)。
前もって感謝します!