このコードでは、ユーザーロールを変更するときに、別のユーザーが同じロールを変更して常に最後に勝つことができます。 1つの部分と他の部分の部分を保存することも可能です。これは、DAOの3つのクエリのために可能です。変更中に別のユーザーが変更を加えることができない、または誰かがそれを以前に変更したことが検出される、「ThreadSafe」を取得したいと思います。DAOデザインでスレッドセーフを取得するには?
私の考えは、RoleManagerのメソッドを変更することでした。
アイデア:
public interface RoleManager {
static synchronized void EditRole(UserRoleBO editedObjet, UserRoleBO nonEditedObject);
これは、(インターフェイスで)このタイプの設計では動作しません。
私の質問:
が デザインを変更せずに問題を解決するためのエレガントな方法はありますか?
追加注:
私は私のコードで大きなミスをしている場合を教えてください。
マネージャー:
public class RoleManagerImpl implements RoleManager {
@Override
public void editRole(UserRoleBO editedObjet, UserRoleBO nonEditedObject) {
EditUserRole editUserRole = EditUserRole.Factory.createEditUserRole(nonEditedObject);
boolean hasChangedBeforeInDB = editUserRole.detectChanges();
if (hasChangedBeforeInDB) {
throw new ManagerException(ManagerException.TYPE.HASCHANGEDBEFOREINDB, null);
}
RoleDAO roleDAO = new RoleDAOImpl();
roleDAO.editRole(editedObjet);
}
}
DAO:助けるため
@Override
public int editRole(UserRoleBO role) {
Connection conn = null;
int status;
try {
//Set up connection
conn = ConnectionPool.getInstance().acquire();
DSLContext create = DSL.using(conn, SQLDialect.MARIADB);
//sql processing and return
status = create.executeUpdate(role.getRole());
EditUserRole editUserRole = EditUserRole.Factory.createEditUserRole(role);
editUserRole.detectChanges();
addPermission(editUserRole.getAddlist(), role.getRole());
deletePermissions(editUserRole.getDeleteList(), role.getRole());
}
// Error handling sql
catch (MappingException e) {
throw new DAOException(DAOException.TYPE.MAPPINGEXCEPTION, e);
}
catch (DataAccessException e) {
throw new DAOException(DAOException.TYPE.DATAACCESSEXECPTION, e);
}
catch (Exception e) {
throw new DAOException(DAOException.TYPE.UNKOWNEXCEPTION, e);
} finally {
//Connection release handling
try{
if(conn != null) {
ConnectionPool.getInstance().release(conn);
}
}
// Error handling connection
catch (DataAccessException e) {
throw new DAOException(DAOException.TYPE.RELEASECONNECTIONEXCEPTION, e);
}
catch (Exception e) {
throw new DAOException(DAOException.TYPE.UNKOWNRELEASECONNECTIONEXCEPTION, e);
}
}
//Return result
return status;
}
感謝。
私は'トンをドンは、メソッドの同期がここに適用されると思います。通常、メモリ内の共有オブジェクトを扱うときには同期を使用しますが、データベースに格納された共有データを扱う場合は同期を使用します。データベースロックとトランザクションを使用する必要があります。 アプリケーションでは、独自のJVMを持つ異なるアプリケーションコンテナインスタンスで複数のインスタンスを実行できることに気づく必要があります。 – tsolakp
@tsolakp多くのありがとうございます。あなたは完全に正しいです。独自のJVMにアプリケーションを実行する複数のサーバーが存在する可能性があります。あなたは私に必要な考えを与えました。データベースが1つしかないと仮定したときに動作するソリューションを投稿します。 – Van