2

私のDAOクラスでは、への参照がありEntityManagerます。EntityManagerを使用してスレッドセーフにアクセスしたいThreadLocal

これまでのところ、私の試みはNullPointerExceptions になっただけで、まともな例を見つけることができないようです。

誰かが私に例を提供したり、正しい方向に向けたりできますか?

update : BalusC の提案を試してみましたが、JSF と JAX-RS Web サービスを同時に介して DAO にアクセスすると、まだエラーが発生します。

 org.hibernate.exception.GenericJDBCException: could not load an entity
 java.sql.SQLException: You can't operate on a closed Connection!!!
 java.lang.NullPointerException
    at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement

私は C3P0 を使用しているため、クローズド接続が問題になる理由がわかりません。

update2 : BalusC の最後のコメントは私の問題を解決したようです:At least, you should not have a single instance of the DAO class shared throughout the application. Create a new one on every request.

4

2 に答える 2

5

EntityManagerを使用してスレッドセーフにアクセスしたいThreadLocal

そうしないでください。コンテナにこれを心配させてください。私はあなたのDAOを@StatelessEJBにし@PersistenceContextて、EntityManager. 例えば

@Stateless
public class UserService {

    @PersistenceContext
    private EntityManager em;

    public User find(Long id) {
        return em.find(User.class, id);
    }

    // ...
}

JSFマネージドBeanまたはJAX-RSサービスに注入するには、次を使用します@EJB:

@EJB
private UserService userService;

トランザクション レベルを制御するには、@TransactionAttributeアノテーションを使用します (デフォルトはTransactionAttributeType#REQUIREDです)。

于 2011-09-15T19:45:47.737 に答える
0

EJB アプリケーション サーバーにいないのに、なぜ EntityManger を CDI インジェクトしようとしているのですか? javax.persistence.Persistence と永続化ユニットの名前を使用して EntityManagerFactory を取得し、EMF を使用してサーブレットのように EntityManager(s) を取得します。データベースへの一貫した並列アクセスを確保するためにデータベース トランザクション ロックを使用します。Java コードで EntityManager を「スレッド」セーフにしないでください。

于 2011-09-15T19:41:43.850 に答える