在 Play Framework 專案中需配置多個 Oracle 資料源,並能在 Ebean ORM 中靈活指定使用哪個資料源進行查詢,避免使用 Model.Finder 硬編碼資料源導致的效能問題。
# 預設資料源
db.default.driver=oracle.jdbc.driver.OracleDriver
db.default.url="jdbc:oracle:thin:@//host1:1521/service1"
db.default.user="user1"
db.default.password="pass1"
ebean.default="models.default.*"
# 第二資料源:test
db.test.driver=oracle.jdbc.driver.OracleDriver
db.test.url="jdbc:oracle:thin:@//host2:1521/service2"
db.test.user="user2"
db.test.password="pass2"
ebean.test="models.test.*"
db.<name>.*:定義名為 <name> 的資料源屬性ebean.<name>:指定該資料源對應的實體模型包路徑// app/models/test/VLine.java
package models.test;
import javax.persistence.*;
import play.db.ebean.*;
@Entity
@Table(name = "v_line")
public class VLine extends Model {
@Id
public Long gno;
public String name;
// 其他欄位...
// 靜態查詢介面,自動綁定 test 資料源
public static final Finder<Long, VLine> find = new Finder<>(VLine.class);
}
若需在運行時動態切換資料源(如 RawSql 查詢):
import play.db.ebean.*;
import com.avaje.ebean.*;
public class VLineRepository {
// 獲取指定資料源的 EbeanServer
private EbeanServer getTestServer() {
return Ebean.getServer("test");
}
public List<VLine> findByCustomSql(String sql) {
EbeanServer server = getTestServer();
RawSql rawSql = RawSqlBuilder.parse(sql)
.columnMapping("gno", "gno")
.create();
Query<VLine> query = server.find(VLine.class);
query.setRawSql(rawSql);
return query.findList();
}
}
| 方式 | 靈活度 | 效能 | 維護性 |
|---|---|---|---|
| Model.Finder("test", ...) | 低(硬編碼) | 可能較慢 | 差 |
| Ebean.getServer("test") | 高(動態獲取) | 連線池複用 | 好 |
ojdbc*.jar 已放入 classpathebean.test 包路徑與實體類 package 一致Play Framework 多資料源配置核心在於 application.conf 中定義 db.<name> 與 ebean.<name> 成對配置,運行時透過 Ebean.getServer(<name>) 靈活獲取對應資料源實例,實現查詢邏輯與資料源解耦。