首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Grails 3.0.9 Service 中多數據源保存數據配置詳解

     編輯:程式設計綜合問答

Grails 3 支持多數據源,Domain 類通過 `datasources` 映射,Service 中保存時需顯式指定數據源名稱。本文詳細說明配置與調用方式。

配置文件

// application.yml
dataSources:
    dataSource:
        url: jdbc:mysql://localhost:3306/main_db
        username: root
        password: 123456
    secondaryData:
        url: jdbc:mysql://localhost:3306/secondary_db
        username: root
        password: 123456
    thirdData:
        url: jdbc:mysql://localhost:3306/third_db
        username: root
        password: 123456

Domain 類映射

class MyDomain {
    String name
    
    static mapping = {
        datasources(['thirdData', 'secondaryData'])  // 指定同步到哪些數據源
    }
}

Service 中保存數據

保存到指定數據源

class MyService {
    def saveToMultiple() {
        def entity = new MyDomain(name: "測試")
        
        // 保存到第三數據源 (名稱首字母小寫)
        entity.thirdData.save(flush: true)
        
        // 保存到第二數據源
        entity.secondaryData.save(flush: true)
        
        // 保存到默認數據源
        entity.save(flush: true)  // 等同 entity.dataSource.save()
    }
}

查詢數據

// 從 secondaryData 查詢
def results = MyDomain.secondaryData.findByCodeAndType("CODE123", "公司")

// 從 thirdData 查詢
def list = MyDomain.thirdData.list()

// 默認數據源
def all = MyDomain.list()

關鍵規則

  • 數據源名稱在代碼中**首字母小寫**:`thirdData`、`secondaryData`、`dataSource`
  • `datasources` 映射僅聲明該 Domain **涉及** 哪些數據源,**不自動同步保存**
  • 每次保存必須**顯式調用**對應數據源的 `save()` 方法
  • 事務管理:每個數據源獨立事務,跨數據源事務需手動協調或用 JTA

動態切換數據源 (高級)

// 運行時根據條件選擇數據源
def saveToDynamic(String dsName) {
    def entity = new MyDomain(name: "動態")
    def method = "${dsName}.save"  // 如 "thirdData.save"
    entity."$method"(flush: true)  // Groovy 動態調用
}

常見問題

問題原因解決
只保存到默認庫未調用具體數據源的 save()顯式調用 entity.thirdData.save()
查詢報錯找不到表該數據源未建表啟用 dbCreate 或手動執行 DDL
事務不一致多數據源無分布式事務引入 Atomikos/Bitronix 配置 JTA

總結

Grails 多數據源核心:**配置多 DataSource → Domain 聲明 datasources → Service 顯式調用 `entity.{dsName}.save()`**。記住數據源名稱首字母小寫,每個數據源獨立管理事務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved