【问题标题】:Multi-tenancy in Hibernate - multi databases (SQLite)Hibernate 中的多租户 - 多数据库 (SQLite)
【发布时间】:2013-05-23 09:24:48
【问题描述】:

我正在尝试使用多数据库进行多租户。我从这个chapter 获取了MultiTenantConnectionProviderImpl

这里我有问题。 Eclipse 找不到类 ConnectionProviderUtils。我正在使用具有依赖关系的 Maven:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.4.Final</version>
    </dependency>

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我不想让你失望,但不久前我遇到了同样的问题。关键是 ConnectionProviderUtil 在文档中非常具有误导性。哪有这回事。 ConnectionProviderUtil 是您必须自己实现的东西。我通过在 MultiTenantConnectionProvider 中构建自己的 DataSource(一个 c3p0 池化的)并从那里分发连接来实现这一点。

    所以你必须自己从头开始实现它。供参考,这是我的解决方案。 Setting up a MultiTenantConnectionProvider using Hibernate 4.2 and Spring 3.1.1

    对于多 DB 方法,您只需将不同的 DataSources 自动连接到 MultiTenantConnectionProvider 并根据租户标识符进行切换。有关详细信息,请参阅此答案:https://stackoverflow.com/a/16769595/2319179

    编辑: 如果你使用 Spring,你可以像这样在 appcontext 中设置一个 DataSource:

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                <property name="driverClassName" value="<jdbcdriver>" />
                <property name="url" value="jdbc:SQLServer://<host>:<port>;databaseName=<dbname>" />
                <property name="username" value="<user>" />
                <property name="password" value="<pw>" />
           </bean>
    

    如果您需要从 java 构建它,您可以这样做:

            cpds = new DriverManagerDataSource();
    cpds.setDriverClass(<jdbc.driver>);
    cpds.setJdbcUrl(<jdbc.url>);
    cpds.setUser("<user>");
    cpds.setPassword("<pw>"));
    

    快速谷歌搜索应该会找到正确的驱动程序。

    【讨论】:

    • 如何为 SQLite 创建数据源?有什么给定的东西还是我需要编写所有代码?
    • 我看到 DriverManagerDataSource 仅在 Spring 中。我可以在 Java SE 中以某种方式做到这一点吗?
    • 应该有 java.sql.DataSource 可用。这也是DriverManagerDataSource的核心。
    • 当你在创建新数据库(和所有表)的地方创建新租户时?
    • 由于目前缺乏更好的解决方案,我正在使用本机 SQL 和 JDBCTemplate 创建新的 Schema/DB。这些表通常是按照您的其他问题中所述创建的:stackoverflow.com/a/16807512/2319179
    【解决方案2】:

    ConnectionProvider 用于自定义获取连接的策略。如果所有模式都相同,这是实现多租户的最佳场所之一。

    除了ConnectionProvider,您还需要一个ThreadLocal 来保存“租户”,可能还需要一个ServletFilter 来设置它(来自会话变量,在登录时设置)。这类似于 Spring 的 OpenSessionInViewFilter 的工作方式。

    总而言之,这可以提供一个非常简单有效的解决方案:

    http://literatejava.com/hibernate/multi-tenancy-architecture-with-hibernate/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2017-03-08
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多