【问题标题】:Providing Connection Info at run-time with Hibernate 4使用 Hibernate 4 在运行时提供连接信息
【发布时间】:2012-05-30 11:25:16
【问题描述】:

开发基于单数据库/多模式的多租户应用程序。有一个共同的模式,因为租户之间共享数据,此外每个租户都有一个单独的模式用于他们的私有数据。身份验证数据(用户 ID/密码/租户 ID)保存在我们在登录期间访问的通用模式中。一旦通过身份验证,每个租户都有一个唯一的用户 ID/密码登录,并有权访问公共架构和租户架构。 “租户用户 id/pwd”将作为加密安全令牌的一部分返回给客户端(无状态),并在随后的 web 或 rest 调用中传回。

我们使用 Spring、Hibernate 4 和 C3PO 进行池化。经过大量阅读/搜索,我相信这是可能的,但没有找到任何例子。在随后的休息调用中,从客户端提供的安全令牌中提取用户标识/密码后,我想将这些传递给休眠以建立与数据库的连接,或者使用具有相同用户标识/密码的现有连接(如果连接中存在)水池。目前我们只是将数据源连接到实体工厂,如下所示。对 java、hibernate、spring 等非常陌生,但已经花费了数小时搜索,此时需要指出正确的方向。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="${jdbc.connection.driver}" />
    <property name="jdbcUrl" value="${jdbc.connection.url}" />
    <property name="user" value="${jdbc.connection.username}" />
    <property name="password" value="${jdbc.connection.password}" />
    <property name="minPoolSize" value="1" />
    <property name="maxPoolSize" value="30" />
    <property name="acquireIncrement" value="5" />
    <property name="idleConnectionTestPeriod" value="300" />
    <property name="maxIdleTime" value="300" />
    <property name="maxStatements" value="0" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.o1rm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="jobmanagement" />
    <property name=""></property>
</bean>

【问题讨论】:

  • 您希望用户在登录后被重定向到他自己的数据库?您可以将会话工厂列表构建为单例,每个用户将从他对应的工厂打开会话。但你到底在寻找什么?你的问题对我来说听起来有点模糊。

标签: hibernate connection runtime multi-tenant


【解决方案1】:

只是在黑暗中开枪:

Configuration cfg = new Configuration();
cfg.configure(CONFIG_FILE_LOCATION);
cfg.setProperty("hibernate.connection.datasource","java:/SomeDatabase_MySQLDS");
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
    .applySettings(cfg.getProperties())
    .buildServiceRegistry();        
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);

您可以将所有常量属性设置到 hibernate.cfg 并在运行时添加其余的。

【讨论】:

    【解决方案2】:

    相反,您可以使用 MultiTenantConnectionProvider 进行配置,并在创建休眠会话以触发数据库查询时在运行时返回数据源连接。

    可以这样配置:

    multiTenant database in hibernate

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多