2016-08-11 8 views
0

私のWebアプリケーションでは、新しいユーザー登録時に、彼のために新しいデータベースを作成する必要があります。例:root => db_root、admin => db_admin、user1 => db_user1など。ユーザーが私のアプリケーションにログインするとき、私は新しい作成されたデータベースに基づいて新しいentityManagerをインスタンス化し、そのdb上でのみデータを操作する必要があります。実行時のwebappの複数のentityManager

1つの問題は、それぞれのユーザー要求に対してどのentityManagerインスタンスを使用するかを知ることです。私は、ユーザーのセッションの属性entityManagerKeyを保存し、このキーで右のEntityManagerを取得

Hashmap<String, EntityManager>

の作成について考えました。このアプローチは、使用されていないentityManagerを破壊するための適切な時間など、いくつかの問題を引き起こします。さらに、私はそれが動作するためにすべてのサーバーのメモリを取ると思う。

素晴らしいアイデアではないようですが、別の解決策を実現しませんでした。私はJPA/HibernateとJerseyを使用しています。 1つのデータベースだけを作成することを除いて、すべてのアイデアが評価されます。

ありがとうございます!

+0

は、あなたは、ユーザーごとに新しいデータベースを作成する必要が絶対によろしいですか?私はそれを必要とするユースケースを見たことがない。 – mszymborski

+0

mszymborski、それは本当に奇妙です。それは必要ではありませんが、私のクライアントはそれを解体し、私は彼にそれをしないように説得しませんでした。 –

答えて

0

あなたはパフォーマンスが問題だと思う場合は、EntityManagerをキャッシュすることができてEntityManagerFactoryを使用し、それをユーザーとパスワード

Map<String, String> properties = new HashMap<String, String>(); 
properties.put("javax.persistence.jdbc.user", "admin"); 
properties.put("javax.persistence.jdbc.password", "admin"); 
EntityManagerFactory emf = Persistence.createEntityManagerFactory(
    "some-jdbc-url", properties); 
EntityManager entityManager = emf.createEntityManager(); 

を渡すことができます。アプリケーションのトラフィック量と使用可能なリソースに応じて、キャッシュされた接続数を判断できます。 DB接続の作成は通常、Webリクエストと比べて時間がかかりませんので、最初はキャッシングを気にしません。ここで

0

は、サンプルコードで、

private static final Map<String, EntityManagerFactory> ENTITY_FACTORIES = new HashMap<String, EntityManagerFactory>(); 

    public void onStart() { 
      this.buildEntityManagerFactories(); 
     } 

     @Override 
     public void onStop() { 
      closeEMFactories(); 
     } 

     private void closeEMFactories() { 
      try { 
       if(ENTITY_FACTORIES.size() > 0) { 
        for(Entry<String, EntityManagerFactory> entityFactoryMgr : ENTITY_FACTORIES.entrySet()) { 
         EntityManagerFactory entityManagerFactory = entityFactoryMgr.getValue(); 
         if(entityManagerFactory.isOpen()) { 
          entityManagerFactory.close(); 
         } 
        } 
        isLoaded = false; 
       } 
      } catch (Exception e) { 
       Logger.error("Error while shutting down the datasource plugin", e); 
      } 
     } 

     /** 
     * Create the entityManagerFactory Bean. 
     * @return entityManagerFactory Bean 
     */ 
     public void buildEntityManagerFactories(String userName) { 
      buildEMFactory(userName, DEFAULT_PERSISTENCE_UNIT); 
     } 

     private void buildEMFactory(String userName, String persistenceUnitName) { 
      if(!isLoaded) { 
       try{ 
        ENTITY_FACTORIES.put(userName, Persistence.createEntityManagerFactory(persistenceUnitName, XOAPP_DB_PROPERTIES)); 
       }catch(Exception e) { 
        Logger.error("Error while building the entity manager factory for the persistence unit :" + persistenceUnitName, e); 
       } 
      } 
     } 

     public EntityManager em(String persistenceName) { 
      EntityManagerFactory entityManagerFactory = ENTITY_FACTORIES.get(persistenceName); 
      if(entityManagerFactory != null) { 
       return entityManagerFactory.createEntityManager(); 
      } 
      return null; 
     } 

/** 
     * Get the entityManagerFactory Bean. 
     * @return entityManagerFactory Bean 
     */ 
     public EntityManagerFactory getEntityManagerFactory(String userName) { 
      EntityManagerFactory entityManagerFactory = ENTITY_FACTORIES.get(userName); 
      if(entityManagerFactory == null) { 
       buildEMFactory(userName); 
       entityManagerFactory = ENTITY_FACTORIES.get(userName); 
      } 
      return entityManagerFactory; 
     } 
関連する問題