Grails:运行时改变dataSource url实现多租户数据库分离

Posted

技术标签:

【中文标题】Grails:运行时改变dataSource url实现多租户数据库分离【英文标题】:Grails: changing dataSource url at runtime to achieve multi tenant database separation 【发布时间】:2014-04-14 20:06:26 【问题描述】:

我正在使用 Grails 构建一个多租户应用程序,并且我想保留单独的数据库。 我需要在运行时动态更改 url 以将 GORM 指向不同的数据库。

我有一个前端充当平衡器,将请求分发到后端主机集群。每个后端主机运行一个 Grails 2.3.5 实例和一个带有多个数据库(每个租户一个)的 mysql-server。我想动态更改数据源,以便 GORM 可以访问正确数据库上的域实体。

有什么想法吗?

谢谢

【问题讨论】:

我 found this 但它似乎被放弃了 【参考方案1】:

您可以在 DataSource.groovy 中配置多个数据源,请查看blog。

在您的域中:添加您的域可以交互的数据源,例如,

static mapping = 
    datasources(['dataSource1', 'dataSource2'])

或“ALL”表示所有数据源,例如,

static mapping = 
    datasource 'ALL'

然后您可以使用要获取/设置数据的数据源名称进行查询,例如,

def userClass = User.class
User user = userClass.dataSource1.findByName('username')

参考:- multipleDatasources, Querying on multiple datasource in grails

【讨论】:

感谢您的回答,但这不起作用,因为新用户订阅时将在运行时添加数据源。所以我不能在 DataSource.groovy 中预先配置它们... 试试***.com/questions/20634276/… 我已经找到了那个链接,但是当它工作时,它不允许将新创建的数据源用作 GORM 数据源。所以不可能运行Domain.myDS.list(),例如... 我已经使用了上面发布的方法,我知道Domain.myDs.list() 在那里工作。但是我从来没有尝试过我在上面粘贴在评论中的链接中作为答案发布的方式,所以我不知道如何在那种情况下进行查询。 @user1690588 ..是否可以在中心位置设置此数据源,而不是在运行时为每个域对象设置?

以上是关于Grails:运行时改变dataSource url实现多租户数据库分离的主要内容,如果未能解决你的问题,请参考以下文章

配置 Grails 以使用自己的 DataSource 实现或代理标准 DataSource

动态连接到 grails 中的数据库

如何使 MySQL 在 grails 2.0 上运行

Grails - 模式配置

Grails如何连接多数据库

Grails 应用程序 - Tomcat 与 Weblogic 上的 JNDI