12

複数のデータソースにアクセスする必要がある 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

ドメイン オブジェクトで静的マッピングを行うと機能します。

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
  }
}

これは、何があっても常にデフォルトのデータソースを使用します。正しいデータソースを使用するのは、ドメイン オブジェクトに問題のデータソースをリストした場合だけです。


だから、誰かがいます:

  1. 動的データソースを追加して成功しましたか?

  2. grails サービスを使用してデータソースを切り替えましたか?

  3. (そして、これは「チェリーオントップ」として素晴らしい追加機能になります)スプリングセキュリティコアで複数のデータソースを使用して成功しましたか?セキュリティプラグインのデータソースをどのように切り替えますか?

ありがとう

--

4

4 に答える 4

1

Grails 2.3.11 で動作する 2 つの異なるデータソースがあります。H2 データベース用に 1 つのデータソースを使用し、Oracle データベース用に別のデータソースを使用しています。Grails 2.3 で Hibernate 4 を使用する必要がありました。私BuildConfig.groovyは hibernate 4 への依存関係を指定しました:

runtime ":hibernate4:4.3.5.4"

私のDataSource.groovyファイルでは、次の Hibernate キャッシュ設定を使用しました。

hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory'
    singleSession = true // configure OSIV singleSession mode
}

(補足: キャッシュ設定がないと、次のような CacheManager エラーが発生しました。「別の名前のない CacheManager が同じ VM に既に存在します」 13、しかし、設定を配置すると、エラーはなくなりました。)

次に、データソースを定義しました。

environments {
    development {
        dataSource_oracle {
            pooled = true
            dialect = org.hibernate.dialect.Oracle10gDialect
            driverClassName = 'oracle.jdbc.OracleDriver'
            username = 'user'
            password = 'pass'
            url = 'jdbc:oracle:thin:@(serverName):(port):(SID)'
            dbCreate = 'validate'
        }
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
            properties {
               jmxEnabled = true
               initialSize = 5
               maxActive = 50
               minIdle = 5
               maxIdle = 25
               maxWait = 10000
               maxAge = 10 * 60000
               timeBetweenEvictionRunsMillis = 5000
               minEvictableIdleTimeMillis = 60000
               validationQuery = "SELECT 1"
               validationQueryTimeout = 3
               validationInterval = 15000
               testOnBorrow = true
               testWhileIdle = true
               testOnReturn = false
               jdbcInterceptors = "ConnectionState"
               defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
            }
        }
    }
}

デフォルトでは、ドメイン クラスは H2 データベースを使用し、Oracle データソースを次のように指定します。

class MyService {

    def dataSource_oracle
    static transactional = true

    def getMethod() {
        assert dataSource_oracle != null, "dataSource is null! Please check your configuration!"
        def sql = Sql.newInstance(dataSource_oracle)
        ...
    }
}

上記では、依存性注入によってサービスに oracle データソースを提供できるようにしていますdef dataSource_oracle。H2 データソースを使用する場合は、データソースを として宣言しdef dataSource、DI が他のデータソースを挿入できるようにします。


http://grails.github.io/grails-doc/2.3.11/guide/conf.html#multipleDatasourcesのドキュメントで指定されているように、2 つのデータソースを動作させることができませんでした。データソースを dataSource および dataSource_lookup として宣言し、次のように使用します。

class DataService {
   static datasource = 'lookup'

   void someMethod(...) {
      …
   }
} 

しかし、上記のソリューションで動作させることができました


于 2016-03-17T14:58:33.350 に答える