Spring Framework 提供豐富的 JDBC 抽象與存儲過程調用支持,配合 DB2 強大的 SQL PL/PL/SQL 引擎,可將複雜業務邏輯下沉數據庫層,實現高性能、事務一致、安全可控的企業級應用。
<dependency> <groupId>com.ibm.db2</groupId> <artifactId>jcc</artifactId> <version>11.5.x</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency>
DataSource 配置 (HikariCP 推薦):
spring.datasource.url=jdbc:db2://host:50000/DBNAME:retrieveMessagesFromServerOnGetMessage=true; spring.datasource.username=app_user spring.datasource.password=**** spring.datasource.hikari.maximum-pool-size=20
@Autowired DataSource dataSource;
public Map<String, Object> processOrder(Long orderId) {
SimpleJdbcCall call = new SimpleJdbcCall(dataSource)
.withProcedureName("PROCESS_ORDER")
.withSchemaName("APP_SCHEMA")
.declareParameters(
new SqlParameter("IN_ORDER_ID", Types.BIGINT),
new SqlOutParameter("OUT_STATUS", Types.VARCHAR),
new SqlOutParameter("OUT_MSG", Types.VARCHAR)
);
return call.execute(Map.of("IN_ORDER_ID", orderId));
}
public class ProcessOrderProc extends StoredProcedure {
public ProcessOrderProc(DataSource ds) {
super(ds, "APP_SCHEMA.PROCESS_ORDER");
setFunction(false);
declareParameter(new SqlParameter("IN_ORDER_ID", Types.BIGINT));
declareParameter(new SqlOutParameter("OUT_STATUS", Types.VARCHAR));
declareParameter(new SqlOutParameter("OUT_MSG", Types.VARCHAR));
compile();
}
public Map<String, Object> execute(Long orderId) {
return super.execute(Map.of("IN_ORDER_ID", orderId));
}
}
jdbcTemplate.call(conn -> {
CallableStatement cs = conn.prepareCall("{CALL APP_SCHEMA.PROCESS_ORDER(?, ?, ?)}");
cs.setLong(1, orderId);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, Types.VARCHAR);
return cs;
}, (CallableStatement cs) -> Map.of(
"status", cs.getString(2),
"msg", cs.getString(3)
));
returnResultSetAsSqlReturnResultSet 或使用 SqlReturnResultSet 映射到 RowMapper。SqlTypeValue 自定義類型映射。JdbcTemplate.batchUpdate 配合 CallableStatementCreator 實現批量 CALL,減少網絡往返。extendedDiagnosticLevel=241 獲取詳細錯誤碼。Spring 靈活的存儲過程調用 API 配合 DB2 強大的服務器端邏輯能力,是構建高性能、可維護企業應用的經典組合。關鍵在於選擇適合團隊技能的調用風格,建立統一規範,並做好監控與測試。