2015-09-04 15 views
2

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

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

Methond on class MyDomain was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.

我不明白为什么,因为我可以定义默认数据源的方式。

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

回答

2

如何查找JNDI dataSourceDataSource.groovy然后如果它存在声明您的可选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 = "..." 
     } 
    } 

我一直在寻找一个替代lightwight方法只是检查是否存在JNDI dataSource,而不是寻找它。但没有运气。

+0

这是一个好主意。我稍微修改了你的代码,因为我必须在我的域类中声明可选的dataSource。而且,如果该jndi查找失败,我将使用默认dataSource的jndi名称来创建可选的jndi名称。 – Phillip

相关问题