Web应用程序的每个用户
问题描述:
一个模式,我试图启用我的Web应用程序使用每个用户一个(MySQL的)架构。 我正在使用弹簧与JPA连同休眠。 Hibernate多租户概念是否相关? 我试图做到这一点的方法是Web应用程序的每个用户
- (一)有
EntityManagerFactory
每HTTPSession
和 - (B)设置为登录在它的模式。
我已经想出了如何做(二),但我仍然有问题在做(一)。 我试过把@Scope(WebApplicationContext.SCOPE_SESSION)
,但全球EntityManagerFactory
呢?
任何帮助?
答
您可以实现自己的ConnectionProvider,有做额外的设置。 但是我认为如果你想为每个用户创建一个模式,那么你的应用程序的体系结构就会有很大的问题。
UPD1
如果您使用的春天。您可以尝试在Session范围内声明一个具有自己的ConnectionProvider impl的bean。
但是有一个很大的问题。 Hibernate创建ConnectionProvider。这意味着你必须自己IMPL ServiceRegistry(通过弹簧工作),并覆盖StandardServiceRegistryBuilder,并实现了一套EntityManagerFactoryBuilder(基于EntityManagerFactoryBuilderImpl但你StandardServiceRegistryBuilder)。
当新的会话已经建立,它会使用的ConnectionProvider来创建连接(也许你将不得不重写一些类)。
答
这真的不建议。这将在后面害你,你不能对不同势用户做不同的架构。您可以随时创建自己的连接属性..
Configuration cfg = new Configuration();
cfg.configure();
System.setProperty("hibernate.connection.password",pass);
System.setProperty("hibernate.connection.username",usr);
System.setProperty("hibernate.connection.driver_class", driver_class);
System.setProperty("hibernate.connection.url", driver_url);
System.setProperty("hibernate.dialect", dialect);
// etc, etc, for all properties
cfg.setProperties(System.getProperties());
sessionFactory = cfg.buildSessionFactory();
它可以是这样的东西..但这是错误的!
您不希望每个会话都有一个EntityManagerFactory。创建一个花费太多时间,而且它没有意义,并且使事情变得非常复杂。你基本上有一个多租户的情况,你应该适当地配置。在多租户设置中,您应该只有一个“EntityManagerFactory”。 – 2015-02-05 20:28:27
你能详细介绍一下如何进行approprietely配置吗?请记住,我需要一个连接池,但每个用户的模式不同(HttpSession)。 – mprasinos 2015-02-05 23:37:05