2016-07-09 8 views
-1

私のウェブアプリのプロトタイプ豆の多くを使用して、それらのほとんどはシングルトンDAO豆を使用している(何の春MVCここでは、コアのみIOCはありません)。多くの異なるプロトタイプBean(異なるリクエストから)が同じメソッドID DAOを同じ瞬間に使用する可能性があるため、シングルトンDAOメソッドをシンクロナイズする必要がありますか?例えばシングルトンメソッドを同期する必要がありますか?

、それが依存

public void setLetterNotNew(int letterId) { 

    final String sql = "UPDATE income SET isnew=? WHERE id=?"; 

    try(Connection con = HikariFactory.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) { 

     ps.setInt(1, 0); 
     ps.setInt(2, letterId); 

     int i = ps.executeUpdate(); 
     if(i==0) throw new SQLException("setLetterNotNew"); 

    } catch (SQLException e) { 
     log.error(e); 
    } 
} 
+0

を聞かせできることを達成するためにあなたがDBを更新しているかによって異なります。多くのフレームワークはすでに同期されているため、追加の作業を行う必要はありません。あなたのドキュメントをチェックしてください。 – markspace

+0

@markspaceここには、spring-iocのecxeptというフレームワークはありません。これはサーブレットベースのWebアプリケーションです。データベースはstandart jdbc経由で更新されています。 – furry

+0

確かに、シングルトンのメソッドを同期させるか、少なくとも同期するブロックの間にDBに行く部分を作るべきです。また、シングルトンを構築して取得する方法も確認して、2つのインスタンスで終わらないようにしてください。 – Rumal

答えて

0

DAO方法。

あなたがコメントで書いたように、あなたは、JDBCを使用しています。 JDBC API are synchronizedおよびすべての操作はauto-commit by defaultです。したがって、JDBC接続を共有しても、メソッドはトランザクションを必要としません(たとえば、数行前に選択されたデータの更新は行われません)。しかし

、あなたがeach connection is also a transactionとして、このメソッドを同期したり、独自のJDBC接続を使用して、各スレッドを提供しなければならないのいずれかよりも、あなたは、トランザクションを必要とする場合。あなたがこの方法で新しい接続を毎回開いたり、Spring handle that problem

+0

メソッドでトランザクションが必要な場合は、どのように定義できますか?私は質問を更新しました。私はプール(静的メソッドHikariFactory.getConnection())からConnectionを取得し、接続は自動的に閉じます。また、私はJdbcがデータベースレベルでマルチスレッディングを処理することを知っています。したがって、問題のメソッドには状態は含まれません。この場合、マルチスレッドはどうやって間違ったことをすることができますか?実際、私はDao-beanのプロトタイプを使用することが最善の考えであると考えています。それで、マルチヘッドについて心配する必要はありません。 – furry

+0

このメソッドには、daoをプロトタイプBeanに変更したり、同期させたりすることなくそのまま使用することができます。ステートメントが単一の更新である場合、トランザクションは必要ありません。トランザクションは、同時に使用される複数の照会がデータベースからの同じデータに対して機能することを確認するために使用されます。あなたのケースでは1つのステートメントしかないので問題はありません。 –

関連する問題