2

我正在尝试使用多数据库进行多租户。从本章开始,我采用了MultiTenantConnectionProviderImpl

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

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

2 回答 2

5

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

所以你必须自己从头开始实现它。供参考,这是我的解决方案。使用 Hibernate 4.2 和 Spring 3.1.1 设置 MultiTenantConnectionProvider

对于多 DB 方法,您可以根据 TenantIdentifier将不同自动连接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>"));

快速的 googlesearch 应该会找到正确的驱动程序。

于 2013-05-28T13:02:59.617 回答
0

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

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

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

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

于 2014-03-31T09:29:43.383 回答