2016-08-11 22 views
0

在我的web應用程序中,當新用戶註冊時,我需要在他的mysql中創建一個新的數據庫。例如:root => db_root,admin => db_admin,user1 => db_user1等。當用戶登錄到我的應用程序中時,我需要基於他創建的新數據庫實例化一個新的entityManager,並僅在該數據庫上操作數據。在webapp運行時的幾個entityManager

一個問題是:我應該怎麼知道我應該爲每個用戶請求使用哪個entityManager實例。我認爲有關創建

Hashmap<String, EntityManager>

節省用戶的會話屬性entityManagerKey,並通過該鍵取回權的EntityManager。這種方法帶來了一些麻煩,比如正確的時間銷燬一個未使用的entityManager。此外,我認爲這將需要所有的服務器內存工作。

雖然這似乎不是一個好主意,但我沒有意識到另一個解決方案。我正在使用JPA/Hibernate和Jersey。除了只創建一個數據庫之外,任何想法都將被讚賞。

謝謝!

+0

你真的確認你要爲每個用戶創建一個新的數據庫?我從來沒有見過需要它的用例。 – mszymborski

+0

mszymborski,這真的很奇怪。雖然沒有必要,但我的客戶端將它解決了,但我沒有說服他不這麼做。 –

回答

0

可以使用的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(); 

如果您認爲性能是一個問題,你可以緩存的EntityManager。根據您的應用程序和可用資源的流量,您可以確定緩存連接的數量。我不會在一開始就打擾緩存,因爲與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; 
     } 
相關問題