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
class MyDomain {
String name
static mapping = {
datasources(['thirdData', 'secondaryData']) // 指定同步到哪些數據源
}
}
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()
// 運行時根據條件選擇數據源
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()`**。記住數據源名稱首字母小寫,每個數據源獨立管理事務。