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