2

別の質問でこれを尋ねてみましたが、詳細を入れすぎた可能性があります。

Grails と複数のデータソースを使用しています。サービスを使用してデータソースを宣言する場合、それはまったく機能しません。

static datasource = "db1"

何があっても、これはGrails Servicesでうまくいきませんでした

ヘルプ/提案をありがとう。

== これを編集して Datasource.groovy を含めます

これで、2 番目のデータベースのドメイン オブジェクトで静的マッピングを使用すると、問題なく動作します。ただし、どのデータベースに書き込む必要があるかをサービスに決定させたいので、サービスのデータソース属性がドキュメントのように機能することを望んでいました。

  1. ドメイン オブジェクトが「すべて」のデータ ソースを使用することを宣言すると、サービスはデフォルトのデータ ソースに書き込みます。

    静的データソース = "db21"

  2. ドメイン オブジェクトが「db1」データソースを使用することを宣言すると、サービスは db1 データソースに書き込みます

    1. 2,3...N 個のデータソースを宣言すると、サービスはデフォルトのデータソースまたはドメイン groovy ファイルで宣言したデータソースにのみ書き込むように見えます。ドキュメントには、サービスを使用してデータソースを選択できるはずだと書かれています。

=============== 編集 ==============

dataSource {
    pooled = true
    driverClassName = "org.h2.Driver"
    username = "sa"
    password = ""
}

hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "validate"
            url = "jdbc:h2:devDb;MVCC=TRUE"
        }
    dataSource_db1 {
        dbCreate = "validate"
        url = "jdbc:h2:dev1Db;MVCC=TRUE"
        pooled = true
        driverClassName = "org.h2.Driver"
        username = "sa"
        password = ""
    }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:mem:testDb;MVCC=TRUE"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:prodDb;MVCC=TRUE"
            pooled = true
            properties {
               maxActive = -1
               minEvictableIdleTimeMillis=1800000
               timeBetweenEvictionRunsMillis=1800000
               numTestsPerEvictionRun=3
               testOnBorrow=true
               testWhileIdle=true
               testOnReturn=true
               validationQuery="SELECT 1"
            }
        }

    }
}
4

1 に答える 1

1

Grails アプリケーションで複数のデータソースを使用しており、上記のアプローチを使用してサービスでデータソースを切り替えることに成功しています...

static datasource = "db1"

ただし、違いは、すべてのドメイン オブジェクトで、ドメイン オブジェクトが属するデータソースを定義したことです。マッピングでデフォルト以外のデータソースを定義せずに実行できるかどうかはわかりません。

static mapping = { datasource 'db1' }

場合によっては、同じ名前で異なるデータソースを指す 2 つの異なるドメイン クラスが存在することがあります。これをきれいに保つために、2 つのドメイン クラスを異なるパッケージに入れ、それらのドメイン クラス/データソースを使用するサービスを同じパッケージに入れます。

例えば...

//Domain Classes
package com.yourcompany
class Student {
    static mapping = {
       //if you don't indicate the datasource it will use the default                      
    }
}

package com.yourcompany.db1
class Student {
    static mapping = {
       datasource 'db1'                     
    }
}

//Services
package com.yourcompany
class DefaultDbService {
   def getStudents() {
      //This will query the default datasource           
      Student.findAll()
   }
}

package com.yourcompany.db1
class Db1Service {
   static datasource = "db1"

   def getStudents() {
       //This will query the 'db1' datasource           
       Student.findAll()
   }
}

このアプローチを試して、探している結果が得られるかどうかを確認してください。

于 2013-09-06T22:53:36.313 に答える