Grails动态数据库连接?

时间:2009-12-10 21:47:40

标签: database hibernate grails groovy

在我工作的地方,我们需要能够查询多个数据库。其中一些是预定义的,我们正在使用数据源进行访问。其他人以客户ID#命名。例如_2。我们有数百个客户,有些客户可以像其他客户一样,根据当时使用该接口的客户,我们需要连接到他们的特定数据库以获取他们的特定数据。

我已经读过Grails无法做到这一点,但我很难相信根本没办法做到这一点。是否有一些可能的方法来编写插件或混乱的hibernate,这将允许像这样的动态连接?有没有人遇到这个问题,你做了什么来处理它?

任何信息都会有所帮助。由于这种疯狂的数据库设计,我们的开发已经走到了尽头!

3 个答案:

答案 0 :(得分:2)

DataSources Plugin可能会派上用场。不知道你会怎么想与此分道扬,,但你肯定会更接近你想要达到的目标。

答案 1 :(得分:1)

我认为这可能是一些实施的想法:

我使用DataSources Plugin +自定义DataSource类。 您可以使用DataSources插件来分隔指向主数据库和客户特定数据库的域类。

要路由到客户数据库,您可以创建自己的DataSource类。我建议从org.springframework.jdbc.datasource.DelegatingDataSource扩展自定义类。 自定义DataSource决定使用哪个目标DataSource。 您应该创建一个数据源池,您可以使用commons.apache.org/pool/来实现池。 在一些不活动时间之后,数据源池可以负责关闭数据源(连接池)。

您可以使用ThreadLocal告知客户登录的“数据源池”池,并且该信息可用于选择(或动态创建)正确的目标数据源。

除非您实现某些特定的Hibernate缓存实现(应该可以使用与DataSource中相同的“路由思路”),否则您必须关闭客户特定类的所有Hibernate缓存。

您可以使用自定义版本覆盖resources.groovy中的默认dataSource bean,请参阅DataSource插件常见问题解答(grails.org/plugin/datasources#faqTab)。

我建议使用Tomcat JDBC Pool(JDBC-Pool Grails插件:grails.org/plugin/jdbc-pool)作为DataSource /数据库池实现。 BoneCP(jolbox.com/)看起来也很有希望,但我还没有测试过它。

答案 2 :(得分:1)

实际上MultiTenant plugin's“SingleTenant”模式正是您所寻找的。