Web应用程序的每个用户

问题描述:

一个模式,我试图启用我的Web应用程序使用每个用户一个(MySQL的)架构。 我正在使用弹簧JPA连同休眠。 Hibernate多租户概念是否相关? 我试图做到这一点的方法是Web应用程序的每个用户

  • (一)有EntityManagerFactoryHTTPSession
  • (B)设置为登录在它的模式。

我已经想出了如何做(二),但我仍然有问题在做(一)。 我试过把@Scope(WebApplicationContext.SCOPE_SESSION),但全球EntityManagerFactory呢?

任何帮助?

+1

您不希望每个会话都有一个EntityManagerFactory。创建一个花费太多时间,而且它没有意义,并且使事情变得非常复杂。你基本上有一个多租户的情况,你应该适当地配置。在多租户设置中,您应该只有一个“EntityManagerFactory”。 – 2015-02-05 20:28:27

+0

你能详细介绍一下如何进行approprietely配置吗?请记住,我需要一个连接池,但每个用户的模式不同(HttpSession)。 – mprasinos 2015-02-05 23:37:05

您可以实现自己的ConnectionProvider,有做额外的设置。 但是我认为如果你想为每个用户创建一个模式,那么你的应用程序的体系结构就会有很大的问题。

UPD1

如果您使用的春天。您可以尝试在Session范围内声明一个具有自己的ConnectionProvider impl的bean。

但是有一个很大的问题。 Hibernate创建ConnectionProvider。这意味着你必须自己IMPL ServiceRegistry(通过弹簧工作),并覆盖StandardServiceRegistryBuilder,并实现了一套EntityManagerFactoryBuilder(基于EntityManagerFactoryBuilderImpl但你StandardServiceRegistryBuilder)。

当新的会话已经建立,它会使用的ConnectionProvider来创建连接(也许你将不得不重写一些类)。

+0

这并没有回答这个问题:我如何定义每个HttpSession使用哪些设置? – mprasinos 2015-02-05 17:39:45

+0

查看详情UPD1 – SergSW 2015-02-05 19:23:55

这真的不建议。这将在后面害你,你不能对不同势用户做不同的架构。您可以随时创建自己的连接属性..

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(); 

它可以是这样的东西..但这是错误的!