我目前正在使用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中定義一個可選的數據源?
這是一個好主意。我稍微修改了你的代碼,因爲我必須在我的域類中聲明可選的dataSource。而且,如果該jndi查找失敗,我將使用默認dataSource的jndi名稱來創建可選的jndi名稱。 – Phillip