2016-01-23 93 views
1

我最近嘗試創建一個應用程序,允許我爲它們的值比較3個單獨的數據庫。這些數據庫是3個Oracle實例,它們包含(基本上)相同的數據庫,但在DEV/TEST/PROD設置中。無法配置Grails 3多個數據源

我想要做的是在GRAILS 3中創建一個Domain類。然後我希望能夠獲取該域類映射到的記錄,但是要爲所有3個環境執行該記錄。

從閱讀Grails的3文檔,它看起來像這應該是可以通過在application.yml定義數據源3(在我這裏的例子,我定義了4):

dataSources: 
    dataSource: 
     pooled: true 
     jmxExport: true 
     logSql: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@someserver:1521:DEV1 
    dataSource1: 
     pooled: true 
     jmxExport: true 
     logSql: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@someserver:1521:DEV1 
    dataSource2: 
     pooled: true 
     jmxExport: true 
     logSql: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@someserver:1521:TEST1 
    dataSource3: 
     pooled: true 
     jmxExport: true 
     logSql: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@someserver:1521:PROD1 

,然後域類中映射指定數據源中的映射:

package plsutils 

class DmjTypes { 
    String code 
    String description 
    Date insertDate 
    String insertUser 
    Date modifyDate 
    String modifyUser 

    String dbEnv 

    static mapping = { 
     datasources(['dataSource1', 'dataSource2', 'dataSource3']) 

     version false 
     table name: "CDE_DMJ_TYPES", schema: "MYSCHEMA" 

     id generator: 'sequence' ,params:[sequence: 'DMJTY_SEQ'] 

     columns { 
      id column: "DMJTY_ID" 
      code column: "DMJTY_CDE" 
      description column: "DMJTY_DESCR" 
      insertDate column: "INSERT_DTT" 
      insertUser column: "INSERT_USER" 
      modifyDate column: "MODIFY_DTT" 
      modifyUser column: "MODIFY_USER" 
      dbEnv formula:'(select inst.instance_name || \'-\' ||  inst.host_name from v$instance inst) ' 
     } 

    } 
} 

,然後,我的控制之內,我應該可以做這樣的事情:

params.max = Math.min(max ?: 10, 100) 
dmjTypesListDev = DmjTypes.dataSource1.list(params) 
dmjTypesListTest = DmjTypes.dataSource2.list(params) 
dmjTypesListProd = DmjTypes.dataSource3.list(params) 

我在第一次調用得到一個錯誤:

URI /dmjTypes/index 
Class groovy.lang.MissingPropertyException 
Message null 
Caused by No such property: dataSource1 for class: plsutils.DmjTypes 

我使用ojdbc7.jar,連接到Oracle 11g,我使用Grails 3.0.9。

我不禁想到我在某個地方做了些微妙的蠢事。任何人都可以幫助我嗎?

乾杯, 艾倫

+0

嗨,你有沒有管理來解決這個問題? –

+1

是的,我確定上面的代碼似乎工作。問題是我最近升級了我使用的grails版本。由於與列出grails版本的現有配置文件衝突,因此存在問題。我更新了配置文件,在gradle.properties文件(3.1.1)中使用了正確的grails版本,完成了一次徹底的清理和重建,並且它似乎可以工作。這裏的教訓是在升級grails版本時要小心,即使它是小版本版本。 –

回答

0

一旦我更正了gradle.properties中引用的grails的版本並執行了完整的清理和重建,我就能夠正常工作。我相信我所有的問題都是因爲我用來構建它的grails的版本不匹配。

所以,這是適當的數據源條目:

dataSources: 
    dataSource: 
     pooled: true 
     jmxExport: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@somelocalserver:1521:LOCAL 
    one: 
     pooled: true 
     jmxExport: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@somedevserver:1521:DEV1 
    two: 
     pooled: true 
     jmxExport: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@sometestserver:1521:TEST1 
    three: 
     pooled: true 
     jmxExport: true 
     driverClassName: oracle.jdbc.OracleDriver 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@someproductionserver:1523:PROD1 

這是在工作領域類:

class DmjTypes { 
    String code 
    String description 
    Date insertDate 
    String insertUser 
    Date modifyDate 
    String modifyUser 

    String dbEnv 

    static mapping = { 
     datasources(['one', 'two', 'three']) 

     version false 
     table name: "CDE_DMJ_TYPES", schema: "MYSCHEMA" 

     id generator: 'sequence' ,params:[sequence: 'DMJTY_SEQ'] 

     columns { 
      id column: "DMJTY_ID" 
      code column: "DMJTY_CDE" 
      description column: "DMJTY_DESCR" 
      insertDate column: "INSERT_DTT" 
      insertUser column: "INSERT_USER" 
      modifyDate column: "MODIFY_DTT" 
      modifyUser column: "MODIFY_USER" 
      dbEnv formula:'(select inst.instance_name || \'-\' ||  inst.host_name from v$instance inst) ' 
     } 

    } 
} 
-1

試試這個:

dataSources: 
    dataSource: 
     pooled: true 
     jmxExport: true 
     logSql: true 
     driverClassName: oracle.jdbc.driver.OracleDriver   
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     autoReconnect: true 
     #url: jdbc:oracle:thin:@someserver:1521:DEV1(I remember in 3.0.9 this is under environments:development:dataSources:dataSource) 
    dataSource2: 
     pooled: true 
     jmxExport: true 
     logSql: true 
     driverClassName: oracle.jdbc.driver.OracleDriver 
     dialect: org.hibernate.dialect.OracleDialect 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@someserver:1521:TEST1 
     autoReconnect: true 
    dataSource3: 
     pooled: true 
     jmxExport: true 
     logSql: true 
     driverClassName: oracle.jdbc.driver.OracleDriver 
     dialect: org.hibernate.dialect.OracleDialect 
     username: MYUSER 
     password: Password1 
     dbCreate: validate 
     url: jdbc:oracle:thin:@someserver:1521:PROD1 
     autoReconnect: true 

在控制器:

static mapping = { 
     datasources(['dataSource', 'dataSource2', 'dataSource3']) 
     ..... 
} 
0

基礎上official documantation嘗試數據源關鍵字:

dataSources: 
    dataSource: 
     pooled: true 
     jmxExport: true 
     driverClassName: org.h2.Driver 
     username: sa 
     password: 
    lookup: 
     dialect: org.hibernate.dialect.MySQLInnoDBDialect 
     driverClassName: com.mysql.jdbc.Driver 
     username: lookup 
     password: secret 
     url: jdbc:mysql://localhost/lookup 
     dbCreate: update 

environments: 
    development: 
     dataSources: 
      dataSource: 
       dbCreate: create-drop 
       url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 
    test: 
     dataSources: 
      dataSource: 
       dbCreate: update 
       url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 
    production: 
     dataSources: 
      dataSource: 
       dbCreate: update 
       url: jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 
       properties: 
        jmxEnabled: true 
        initialSize: 5 
        … 
      lookup: 
       dialect: org.hibernate.dialect.Oracle10gDialect 
       driverClassName: oracle.jdbc.driver.OracleDriver 
       username: lookup 
       password: secret 
       url: jdbc:oracle:thin:@localhost:1521:lookup 
       dbCreate: update