Grailsを使用すると、DataSources.groovyファイルでさまざまな環境(開発、テスト、本番)のデータソースを非常に簡単に構成できますが、1つの環境で複数のデータソースを構成する機能はないようです。同じGrailsアプリケーションから複数のデータベースにアクセスする必要がある場合はどうすればよいですか?
6 に答える
Grails 2.xx では、異なるドメイン クラスの異なるデータベースを接続するのは非常に簡単です。
例えば
development {
dataSource {//DEFAULT data source
.
.
}
dataSource_admin { //Convention is dataSource_name
url = "//db url"
driverClassName = "oracle.jdbc.driver.OracleDriver"
username = "test"
password = 'test123'
}
dataSource_users {
}
}
ドメインクラスで任意のデータソースを使用できます
class Role{
static mapping = {
datasource 'users'
}
}
class Product{
static mapping = {
datasource 'admin'
}
}
Grails 2.0 以降を使用している場合、プラグインは必要なく、ネイティブでサポートされています。
http://www.grails.org/doc/latest/guide/single.html#multipleDatasources
Grails の GORM レイヤーで複数のデータソースを直接使用できるようにする Grails プラグインがあります: http://burtbeckwith.com/blog/?p=70
Grails 2.0 は、プラグインなしで複数のデータ ソースを処理できます。
dev(h2 dataSource) および test(mysql dataSource_mysql) 環境の異なるデータソースの例:
DataSource.groovy:
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
dataSource_mysql {
dialect = org.hibernate.dialect.MySQLInnoDBDialect
driverClassName = 'com.mysql.jdbc.Driver'
username = "user"
password = "pass"
url = "jdbc:mysql://mysqldb.com/DBNAME"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:file:../devDb;MVCC=TRUE"
sqlLogging = true
}
}
test {
dataSource_mysql {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "create" // one of 'create', 'create-drop', 'update', 'validate', ''
sqlLogging = true
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
あなたは本当にこれをしたいですか?私の経験では、ここでの通常のシナリオは次のとおりです。
- アプリケーションは、独自のデータベース スキーマで独自のデータを管理します。
- 多くの場合、アプリケーションは他のソースからのデータを必要とします (たとえば、参照データをコピーして貼り付けることはできません)。
私は通常、すべてのスキーマが 1 つのデータベース インスタンスに存在するという贅沢を常に持っていました。したがって、私のアプリケーション:
- データベース接続は 1 つだけです。これは、所有するスキーマへの接続であり、読み取り/書き込みアクセス権があります。
- 他のアプリケーションは、ビューを介してデータを「エクスポート」します
- 私のアプリケーションにはこれらのビューへの読み取りアクセス権があり、そのビューのシノニムがあり、ローカルに表示されます
ビューを使用する理由は、データを公開しているアプリケーションが
- エクスポートされていることと、何がエクスポートされているかを明示的に認識しています
- スキーマの内部構造を公開しません (したがって、内部構造が変更された場合、ビューが正しい限り、消費するアプリは知りません)
Grails アプリケーションで実際にこれを行う必要はありませんでしたが、このアプローチは機能するはずです。
アプリケーション間でデータを共有するもう 1 つの方法は、Web サービスを作成してデータを公開することです。Grails はこれを簡単にします。
お役に立てば幸いですが、このアプローチがすべての状況に適用できるとは限りません。
次の投稿は、このテーマに関する最良の情報源のようです。
grailsでmutli-dataSourceを取得する方法
要約すると、次のようになります。
- DevelopmentDataSourceでdatasource1を定義します
- resources.xmlでdatasource2を定義します
- datasource2を使用してドメインオブジェクトのCRUD用のDAOを作成します
- hibernate.cfg.xmlで、すべてのドメインオブジェクトを一覧表示します。
最初のデータソースのみが動的ファインダーメソッドを持ちます。
本当に単純なクエリで、ORM機能がなくてもかまわない場合は、GroovySQLまたはHibernateのネイティブSQL機能を使用できます。