【问题标题】:Grails - switching data sources based on UserGrails - 基于用户切换数据源
【发布时间】:2013-11-25 21:56:37
【问题描述】:

我们正在开发一个 Grails Web 应用程序,其中需要将不同的用户(客户)指向仅包含其组织数据的不同数据库。不幸的是,分离的数据库是必需的,我们被要求只能为每个人提供一个 Web 应用程序。

但是,Grails 只希望一个数据源池连接到一个数据库。

我们希望能够根据登录的用户在每个会话中切换数据库连接,其中在 BootStrap init() 期间从属性文件中读取不同的连接。

到目前为止,我们一直无法找到似乎没有竞争条件的解决方案,也没有我们可以找到的插件,而且这似乎不是一个流行的问题。

我们最有希望的是创建一个自定义动态数据源,在 Bootstrap 中设置以定义一个组织->数据源的映射,并利用 Bootstrap 中定义的闭包在 GORM 行为之前找到合适的数据源,但这似乎会导致竞争有延迟时的条件。

有人知道如何合法地执行这种切换吗?

谢谢

【问题讨论】:

    标签: database grails pool context-switching


    【解决方案1】:

    考虑到 Grails 是基于 Spring 构建的,最好的办法是开发自己的可解析数据源。

    1. Dynamic datasource routing
    2. Example of datasource routing

    【讨论】:

    • 嗨 Joshua,谢谢,我会把它转交给我们,我们会看看它。如果这种解决方案可以与 GORM 集成,那么它可能会奏效。
    • 我们在 Grails 1.2.x 中使用了非常相似的方法,我们在 GORM 中遇到的唯一问题是我们必须自己进行数据库迁移,因为我们解析数据源的方式(类似于您的每个用户/公司)。
    • 嗯,好的。另一位致力于此问题的开发人员告诉我,他尝试了类似的方法,但没有奏效。如果有时间,我会亲自尝试适应这一点。
    • 那么它最终对你有用吗?我需要做类似的事情
    【解决方案2】:

    您的问题不清楚您是部署一次应用程序,并尝试配置用户使用的DataSource,还是只想通过部署进行配置。

    如果只是每次部署,Grails allow you to externalize the configuration。您可以将其设置为使用类路径或静态位置中的文件。

    【讨论】:

    • 嗨,塞尔吉奥。我们不想通过部署进行配置。我们希望在同一个部署中拥有多个数据源,并且能够在 Web 服务调用中动态切换到其中的任何一个,用于与发出请求的用户组织相关联的数据库。该应用程序是 JS/GSP 与基于 Grails 的 Web 服务通信,Web 服务将知道用户信息,包括他们所属的组织。
    • 嗯,这可能是我不知道我们可以做的事情......所以如果我们有 2 个数据源“customer1”和“customer2”,我们可以调用 ZipCode."customer2".get(42)它会使用customer2的数据源吗?我理解正确吗?
    • 是的,您可以调用 ZipCode.customer2.get()。 " 解释变量时需要。
    • 有趣。如果我们可以动态创建数据源,这可能是最简单的方法。让我试一试,看看我们能不能让它发挥作用。
    • Sergio,假设我有一个域对象 Emp,两个已配置的数据源,并在我尝试 Emp."$dataSourceName" 时将字符串传递给实际调用名为 dataSourceName 的域对象方法的方法.list() 我得到一个编译错误“应用查询转换发生致命错误:null”。当我尝试 Emp.'$dataSourceName'.list() 时,它会编译,但在运行时出现错误,即 Emp 类没有属性 $dataSourceName。我还尝试在 dataSourceName 周围使用 {},结果相似。我做错了什么?
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多