【问题标题】:Define optional (multiple) datasource in Grails在 Grails 中定义可选(多个)数据源
【发布时间】:2015-09-04 08:02:19
【问题描述】:

我目前正在使用 Grails 2.3.11 开发一个 Grails 插件,并且熟悉使用多个数据源。但是现在我希望该插件提供的我的域对象可以使用不同的数据源(由于性能原因,所有数据都可以存储在不同的数据库中)。

问题在于,第二个数据源是可选的,这意味着用户可以在 tomcat 中定义第二个数据源(可通过 JNDI 访问),但不是必须的。这一点很重要:用户可以在 servlet 容器中定义第二个数据源,而 Grails 应用程序必须检查是否有第二个数据源可用!

更具体一点:我有一个域类:

class MyDomain {

    static mapping = {
        datasource('optionalDS')
    }
}

我的 DataSource.groovy:

dataSource {
    jndiName = "..."
}

dataSource_optionalDS {
    jndiName = "..."
}

问题是,如果用户没有为该可选数据源配置 JNDI 名称,这将失败(因为它是可选的,他不必这样做)。

我尝试创建一个委托数据源:

class OptionalDataSource extends DelegatingDataSource {

    ...
    // the main purpose is to check, if the optional DS
    // can be created using JNDI. If this fails, the default
    // DS is used
    setTagetDataSource(dataSource)
    ...

}

在我的插件描述符中:

def doWithSpring = {
    dataSource_optionalDS(OptionalDataSource) {
        // set default DS in case optional can not be created
        dataSource = ref('dataSource')
    }
}

这个解决方案的问题是,dataSource optionalDS 不可用。如果我尝试读取数据,即 MyDomain.findAll(),我会收到以下错误:

类 MyDomain 上的方法在 Grails 应用程序之外使用。 如果在使用模拟 API 的测试上下文中运行,或者 正确引导 Grails。

我不明白为什么,因为我可以这样定义默认数据源。

所以,我的问题是:如何在 Grails 中定义可选数据源?

【问题讨论】:

    标签: grails datasource multiple-databases


    【解决方案1】:

    如何在DataSource.groovy 中查找JNDI dataSource,然后如果它存在,则声明您的可选dataSource。类似以下的东西

        //default dataSource
        dataSource {
            jndiName = "..."
        } 
    
        //optional dataSource
        //let's first lookup the JNDI dataSource
        def jndiDataSource
    
        try {
            jndiDataSource = InitialContext.doLookup("...")
        } 
        catch(NamingException ne) {}
    
        //now if jndiDataSource exists we can declare the optional dataSource
        if(jndiDataSource) {
            dataSource_optionalDS {
                jndiName = "..."
            }
        }
    

    我正在寻找一种替代的轻量级方法来检查 JNDI dataSource 是否存在而不是查找它。但没有运气。

    【讨论】:

    • 这是个好主意。我稍微修改了您的代码,因为我必须在我的域类中声明该可选数据源。而且,如果该 jndi 查找失败,我将使用我的默认数据源的 jndi 名称来创建那个可选的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多