2015-09-04 56 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