Transactions hibernate中的多租户数据库
有谁能给我举一个使用Hibernate和spring Hibernate Txmanager进行tx管理的多租户数据库的例子吗 我的要求是 它的主数据库始终处于打开状态,并包含有关租户数据库的信息。 第一次点击主机时,获取特定租户的db信息,并为租户生成会话ZFactory,其余请求应通过租户会话提供服务。 我已经实现了 但我无法让我的事务管理器为租户Dbs工作Transactions hibernate中的多租户数据库,transactions,multi-tenant,Transactions,Multi Tenant,有谁能给我举一个使用Hibernate和spring Hibernate Txmanager进行tx管理的多租户数据库的例子吗 我的要求是 它的主数据库始终处于打开状态,并包含有关租户数据库的信息。 第一次点击主机时,获取特定租户的db信息,并为租户生成会话ZFactory,其余请求应通过租户会话提供服务。 我已经实现了 但我无法让我的事务管理器为租户Dbs工作 <property name="packagesToScan"> <array>
<property name="packagesToScan">
<array>
<value>beans.table</value>
<value>beans.views</value>
</array>
</property>
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<!-- <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> -->
<prop key="c3p0.testConnectionOnCheckout">false</prop>
<prop key="c3p0.min_size">2</prop>
<prop key="c3p0.max_size">10</prop>
<prop key="c3p0.timeout">300</prop>
<prop key="c3p0.max_statements">50</prop>
<prop key="c3p0.idleTestPeriod">300</prop>
<prop key="hibernate.generate_statistics">true</prop>
</props>
</property>
</bean>
<bean id="tenantSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" lazy-init="true">
<property name="packagesToScan">
<array>
<value>beans.table</value>
<value>views</value>
</array>
</property>
<!--<property name="dataSource" ref="dataSource" />-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<!-- <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> -->
<prop key="c3p0.testConnectionOnCheckout">false</prop>
<prop key="c3p0.min_size">2</prop>
<prop key="c3p0.max_size">30</prop>
<prop key="c3p0.timeout">300</prop>
<prop key="c3p0.max_statements">50</prop>
<prop key="c3p0.idleTestPeriod">300</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.multiTenancy">DATABASE</prop>
<prop key="hibernate.tenant_identifier_resolver">factory.MultiTenantIdentifierResolver</prop>
<prop key="hibernate.multi_tenant_connection_provider">factory.MultiTenantConnectionProvider</prop>
</props>
</property>
</bean>
<!-- Declare a transaction manager -->
<!-- <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" /> spring.fix.HibernateTransactionManager
com.my.hibernate4.spring.fix.HibernateTransactionManager"> <property name="sessionFactory"
ref="sessionFactory" /> -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="tenantTransactionManager"
class="factory.MultiTenantHibernateTxManager" p:autodetectDataSource="false">
<property name="sessionFactory" ref="tenantSessionFactory" />
</bean>
<!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true"/>
<tx:annotation-driven transaction-manager="tenantTransactionManager"
proxy-target-class="true" />
豆子桌
beans.views
org.hibernate.dialogue.mysql5innodbdialogue
符合事实的
符合事实的
错误的
错误的
2.
10
300
50
300
符合事实的
豆子桌
意见
org.hibernate.dialogue.mysql5innodbdialogue
符合事实的
符合事实的
错误的
错误的
2.
30
300
50
300
符合事实的
数据库
factory.MultiTenantIdentifier解析器
factory.MultiTenantConnectionProvider
这是我在Spring论坛上的解决方案(我的昵称是deggesim)->您不应该连接到根数据库。相反,您应该首先直接连接到正确的pdb。要连接到根数据库,我已经在MultiTenantConnectionProvider实现类中创建了不同的会话工厂,因此从那里我可以同步获取数据源,并为租户会话工厂提供连接。我无法直接连接到数据库。。因为我的应用程序登录基于根数据库,其余部分基于租户数据库。基于支持特定租户的用户。My tenantSessionFactory可以快速工作并创建。我面临的主要问题是在多个会话中管理事务。我无法在该会话中管理事务。每次我需要打开NewSession,因为我无法在当前上下文中获取会话。由交易经理/会议持有人维护