【问题标题】:Web application with one schema per User每个用户具有一个架构的 Web 应用程序
【发布时间】:2015-02-06 03:28:57
【问题描述】:

我正在尝试让我的 Web 应用程序为每个用户使用一个 (MySQL) 架构。 我正在使用 SpringJPA 以及 Hibernate。 Hibernate 多租户概念是否相关? 我尝试这样做的方式是

  • (a) 每个 HTTPSession
  • 都有一个 EntityManagerFactory
  • (b) 在登录时在其中设置架构。

我已经弄清楚如何做 (b),但我在做 (a) 时仍然遇到问题。 我试过放@Scope(WebApplicationContext.SCOPE_SESSION),但是全局的EntityManagerFactory呢?

有什么帮助吗?

【问题讨论】:

  • 您不希望每个会话都有一个EntityManagerFactory。创建一个需要太多时间,而且它没有任何意义,而且让事情变得非常复杂。你基本上有一个多租户的情况,你应该适当地配置它。使用多租户设置,您只需要一个 EntityManagerFactory
  • 您能否详细说明如何正确配置它?请记住,我需要一个连接池,但每个用户需要不同的架构 (HttpSession)。

标签: java spring hibernate jpa multi-tenant


【解决方案1】:

您可以实现自己的 ConnectionProvider 并进行额外设置。 但是我认为,如果您想为每个用户执行一个架构,那么您的应用程序架构会遇到很大的问题。

UPD1

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

但是有一个大问题。 Hibernate 制作 ConnectionProvider。这意味着您必须实现自己的 ServiceRegistry(通过 Spring 工作)并覆盖 StandardServiceRegistryBuilder,并实现 EntityManagerFactoryBuilder(基于 EntityManagerFactoryBuilderImpl 但使用您的 StandardServiceRegistryBuilder)。

创建新会话后,它将使用 ConnectionProvider 创建连接(可能您必须覆盖某些类)。

【讨论】:

  • 这没有回答问题:如何定义每个 HttpSession 使用的设置?
【解决方案2】:

这真的不建议..这会在以后伤害你,你不能为不同的用户做不同的架构。您始终可以为连接创建自己的属性..

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

可能是这样的……但这是错误的!

【讨论】:

    猜你喜欢
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2021-08-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多