webapp中运行时的几个entityManager

时间:2016-08-11 20:25:13

标签: java hibernate jpa

在我的Web应用程序中,当新用户注册时,我需要在mysql中为他创建一个新数据库。示例:root => db_root,admin => db_admin,user1 => db_user1等。当用户登录我的应用程序时,我需要基于他新创建的数据库实例化一个新的entityManager,并仅在该数据库上操作数据。

一个问题是:我怎么知道我应该为每个用户请求使用哪个entityManager实例。我想过创建一个

Hashmap<String, EntityManager>

在用户会话中保存属性entityManagerKey,并通过此键检索正确的entityManager。这种方法带来了一些麻烦,例如正确的时间来销毁未使用的entityManager。此外,我认为它将需要所有服务器内存工作。

虽然这似乎不是一个好主意,但我没有意识到另一个解决方案。我正在使用JPA / Hibernate和Jersey。除了只创建一个数据库外,任何想法都会受到赞赏。

谢谢!

2 个答案:

答案 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;
        }