1

开发基于单数据库/多模式的多租户应用程序。有一个共同的模式,因为租户之间共享数据,此外每个租户都有一个单独的模式用于他们的私有数据。身份验证数据(用户 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>
4

2 回答 2

0

只是在黑暗中开枪:

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 并在运行时添加其余属性。

于 2013-05-07T20:50:19.643 回答
0

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

可以这样配置:

休眠中的多租户数据库

于 2014-12-30T11:42:40.620 回答