名前、件名、記入欄がある学生表がDBにあります。 1人の学生が、この表の異なる科目に複数のレコードを持つことができます。文字列の場合、どのように同期を使用する必要がありますか?
私はこのような更新方法を持っている学生のDAOクラスを持っている:
public marks updateStudent(String name, String subject, int marks){
//this method first check if the record of this name and subject is there in DB
if(getStudentRecordFromDB(name, subject){
//then return marks for this student
}else{
//insert the record in DB and return marks
insertRecord(name, subject, marks);
}
}
このメソッドは、同じ生徒の名前と件名のために複数のスレッドで同時に呼び出すことができます。私は同じ名前と主題を更新する複数のスレッドの場合にのみ同期させたいです。 私はこのメソッドをname + subjectの文字列に同期させることを考えましたが、これは文字列定数プール(その文字列の存在)のために結果が得られないという悪い習慣なので、もっと良い解決法を使いたいと思います。 DAO.classで同期させたくないのは、同じレコードが更新された場合にのみ同期したいからです。 これを行う最善の方法は何ですか?
DBアップデートを同期する必要はありません。なぜそれをしたいのですか? –
DB側には、同じ名前と件名のレコードを複数挿入することに制限はありません。残念ながらDBでは何も変更できません。だから私は私のJavaサービスでのみ同期する必要があります。私はそれが悪いデザインかもしれないことは知っているが、私はそれを助けることができないし、私はそれがJavaコードからのみ動作するようにするソリューションが欲しい。 –
ここでデータベーストランザクションを使用し、 'getStudentRecordFromDB'メソッドで更新のためにレコードをロックする(またはオプティミスティックロックを使用する)必要があります。技術的にはString(同期する前に 'String.intern'メソッドを使用して一意のインスタンスを取得)することは技術的に可能ですが、同じデータベース上で動作する別のアプリケーションや、アプリケーションが実行中です。 –