複数のデータソースにアクセスする必要がある Grails アプリケーションに取り組んでいます。データソースはデフォルトのデータベースに定義されています (つまり、データソースはそこに保存されており、デフォルトのデータベースを呼び出して、接続を準備する必要があるデータソース名のリストを取得する必要があります)。サーバーが起動したら、データベースのリストを取得し、データソース Bean を作成して注入します。動的に追加されたすべてのデータベースは、構造的に同一です (つまり、同じテーブルとドメイン オブジェクト構造を持ちます)。
この質問は、有用なコードに最も近いものですが、必要なものではありません。
問題#1
- データソース Bean を登録すると、期待どおりの場所に表示されますが、Grails はそれらを取得しません。
これは私がそれらを追加する方法です:
// Register datasource bean
def beanName = 'dataSource_devDB1'
BeanBuilder bb = new BeanBuilder()
bb.beans {
"${beanName}"(BasicDataSource) {
url = "jdbc:h2:devDB1Db;MVCC=TRUE"
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
}
bb.registerBeans(grailsApplication.mainContext)
// check that it registered
def ctx = grailsApplication.mainContext
def ctxlist = ctx2.beanDefinitionNames.findAll{it.contains( 'dataSource' )}
log.info "ctxlist = " + ctxlist
これは以下を出力します:
[dataSource, dataSourceUnproxied, dataSource_devDB1]
これを行うと、デフォルトのデータソースで操作を実行できます。それだけです。
問題#2
- すべてのデータソースを
Datasource.groovy
ファイルの一部として宣言すると、すべてのデータベースで操作を実行できますが、ドキュメントで宣伝されているとおりではありません
ドメイン オブジェクトで静的マッピングを行うと機能します。
static mapping = {datasources(['devDB1', 'devDB2', 'DEFAULT')] or datasource = 'ALL'
しかし、私が望むのは、これらすべてをサービスの一部として実行し、すべてのデータソースを使用するようにドメイン オブジェクトを宣言することです。
サービスでのデータソースの宣言が機能していません:
class secureDBService{
static datasource = "devDB1"
def readWriteMethod(){
.....
// this always uses the default datasource ignoring the static property above.
// the only time it uses devDB1 is if I declare it as part of the domain datasource
// mapping
}
}
これは、何があっても常にデフォルトのデータソースを使用します。正しいデータソースを使用するのは、ドメイン オブジェクトに問題のデータソースをリストした場合だけです。
だから、誰かがいます:
動的データソースを追加して成功しましたか?
grails サービスを使用してデータソースを切り替えましたか?
(そして、これは「チェリーオントップ」として素晴らしい追加機能になります)スプリングセキュリティコアで複数のデータソースを使用して成功しましたか?セキュリティプラグインのデータソースをどのように切り替えますか?
ありがとう
--