2009-12-10 118 views
0

我在哪里工作,我们有多个数据库,我们需要能够查询。其中一些是预定义的,我们正在使用数据源进行访问。其他则以客户ID#命名。比如_2。我们有数百个客户,一些客户可以构成其他客户,并根据当时哪个客户正在使用该界面,我们需要连接到他们的特定数据库以获取他们的特定数据。Grails动态数据库连接?

我读过这对Grails是不可能的,但我很难相信,根本没有办法做到这一点。有没有一些可能的方式来写一个插件或混乱与休眠,这将允许这样的动态连接?有没有人遇到过这个问题,你做了什么处理?

任何信息将会有所帮助。由于这个疯狂的数据库设计,我们的开发已经陷入了一个死胡同!

+0

我不知道你的问题的答案(我有一种感觉,它是不可能的,因为它是在编译时定义的hibernate)?但是该死的太疯狂了!祝你好运 – Jay 2009-12-10 21:50:52

回答

2

DataSources Plugin可能派上用场。不知道你会怎么想这个碎片,但你肯定会更接近你想要达到的目标。

1

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

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

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

您可以使用ThreadLocal来告诉“数据源池”池中哪个客户已登录,并且该信息可用于选择(或即时创建)正确的目标数据源。

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

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

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

+0

另一个答案:http://stackoverflow.com/a/5429546/166062 – 2014-08-09 12:30:57