休眠中的多租户数据库

Posted

技术标签:

【中文标题】休眠中的多租户数据库【英文标题】:multiTenant database in hibernate 【发布时间】:2014-12-01 17:57:56 【问题描述】:

谁能给我看一个多租户数据库与 Hibernate 并使用 spring Hibernate Txmanager 进行 tx Mgmt 的示例。

我的要求是

其他主数据库始终打开并包含有关租户数据库的信息。 在第一次访问主服务器时,获取特定租户的数据库信息并为租户生成会话 ZFactory,休息请求应通过租户会话提供服务。 我已经实现了

但我的事务经理无法为租户 Dbs 工作。

    <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" />

【问题讨论】:

您不应该连接到根数据库。相反,您应该首先直接连接到正确的 pdb。 为了连接到根数据库,我已经在 MultiTenantConnectionProvider 实现类中创建了不同的会话工厂,因此我从那里获得 DataSourceDynmically 并为tenantSessionFactory 提供连接。 我无法直接连接到数据库。因为我的应用程序登录是基于根数据库,其余部分是基于租户数据库。基于支持特定租户的用户。 我的tenantSessionFactory 工作并迅速创建我面临的主要问题是管理多租户会话上的事务。我无法通过该会话管理事务。每次我需要 openNewSession 因为我无法在当前上下文中获取会话。由事务管理器/SessionHolder 维护 【参考方案1】:

这是我在 Spring 论坛上的解决方案(我的昵称是 deggesim)-> http://forum.spring.io/forum/spring-projects/data/114116-sessionfactory-configured-for-multi-tenancy-but-no-tenant-identifier-specified

【讨论】:

以上是关于休眠中的多租户数据库的主要内容,如果未能解决你的问题,请参考以下文章

EEPlat PaaS中的多租户数据隔离模式

Spring Boot 中的多租户

在休眠多租户应用程序中启动时不查找数据源

没有复合键的休眠中的多对多

使用 Firebase 和 Flutter 的多租户 SaaS 应用

Elastic Search 中的多租户