在我的Web应用程序中,当新用户注册时,我需要在mysql中为他创建一个新数据库。示例:root => db_root,admin => db_admin,user1 => db_user1等。当用户登录我的应用程序时,我需要基于他新创建的数据库实例化一个新的entityManager,并仅在该数据库上操作数据。
一个问题是:我怎么知道我应该为每个用户请求使用哪个entityManager实例。我想过创建一个
Hashmap<String, EntityManager>
在用户会话中保存属性entityManagerKey,并通过此键检索正确的entityManager。这种方法带来了一些麻烦,例如正确的时间来销毁未使用的entityManager。此外,我认为它将需要所有服务器内存工作。
虽然这似乎不是一个好主意,但我没有意识到另一个解决方案。我正在使用JPA / Hibernate和Jersey。除了只创建一个数据库外,任何想法都会受到赞赏。
谢谢!
答案 0 :(得分: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请求相比,创建数据库连接通常不是那么耗时。
答案 1 :(得分: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;
}