2013-12-14 13 views
7

JPA、CDI(OpenWebBeans + Deltaspike JPAモジュール)、JSFを使用してアプリケーションを作成しようとしています。私はSpringフレームワークを使用するのと同じ方法でTomcatにデプロイされたCDIを使用しています。 EntityManagerのはDeltaSpike JPAのmodulehttpを用いて注入されどのCDIスコープをDAOクラスとサービスクラスに使用するか

public abstract class GenericDaoJpa<T> implements GenericDao<T> { 
    private static final Log logger = LogFactory.getLog(GenericDaoJpa.class); 

    @Inject 
    protected EntityManager entityManager; 

    private Class<T> type; 

://deltaspike.apache.org/jpa.html私はDAOは、このようなGenericDAOImpl(最初の数行)と呼ばれています。このGenericDaoは、サービスクラスによって使用される具体的なDAO(UserDaoなど)によって継承されます。このようDAOとサービスクラスの両方が、彼らはシングルトンだろう春とは異なり依存スコープを持つことになりますCDIを使用して

public class UserServiceImpl implements UserService { 

    private static final Log logger = LogFactory.getLog(UserServiceImpl.class); 

    @Inject 
    private UserDao userDao; 

    @Transactional 
    public void saveUser(UserDto user) throws UserServiceException { 
     try { 
      User u = new User(user); 
      userDao.create(u); 
     } catch (Exception e) { 
      logger.error("Error while creating user.", e); 
      throw new UserServiceException("Error while creating user."); 
     } 
    } 
} 

:たとえばUserServiceImplについては

。したがって、すべてのクライアントには新しいインスタンスが注入されます。 DAOクラスとサービスクラスのスコープをApplicationScopeに変更する必要がありますか?しかし、仕様では、直列化可能なすべてのクラスを作成する必要があります。 Daoクラスの場合、これが問題になる可能性があり、EntityManagerに一時的なマークを付ける必要がありますか? A

私はどんな勧告についてもうれしいでしょう。

答えて

5

@ApplicationScopedは、Serializableとは関係ありません。これらは常に周囲にあり、決してディスクには永続しません。 @SessionScopedは、HTTPセッションオブジェクトの動作によりシリアル化が必要になります。

スコープを使用して依存関係をすべて残しておくと、メモリリークが発生する可能性があります(@Dependentオブジェクトが削除されたときは決してありません)。あなたのアプリケーションがかなりステートレスであれば、@RequestScopedを使うことができます。 @ApplicationScoped複数のクライアントがインスタンスに接続することを考慮する必要があります。

+1

あなたの答えをありがとう。私が@ApplicationScopedを使用する場合、私はSpringのようにBean(春にスコットされたシングルトン)が同時に何度もアクセスされることを期待しています。したがって、パフォーマンス上の問題はありません。クラスのスレッドを安全にすることだけが私の考え方です。または、並行処理はCDIコンテナによって自動的に処理されませんか? –

+1

並行処理はCDIコンテナによって処理されません。 –

関連する問題