上一篇
场景引入:
"小王刚接手公司老项目,发现代码里用JDBC连接DB2的写法又臭又长,查询个数据要写20行模板代码😫,隔壁组的老张却能用几行代码优雅完成,还自带连接池和异常处理!今天我们就来拆解这些高效技巧——"
// 📌 关键点:使用Properties替代拼接URL Properties props = new Properties(); props.put("user", "db2admin"); props.put("password", SecurityUtil.decrypt("加密后的密码")); // 🔒 安全提示 props.put("sslConnection", "true"); // 启用SSL Connection conn = DriverManager.getConnection( "jdbc:db2://192.168.1.100:50000/SAMPLE", props);
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:db2://localhost:50000/SAMPLE"); config.setUsername("db2admin"); config.setPassword("password"); config.addDataSourceProperty("prepStmtCacheSize", "250"); // 🚀 性能优化 HikariDataSource ds = new HikariDataSource(config);
try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement( "SELECT * FROM EMP WHERE DEPT=?", ResultSet.TYPE_SCROLL_INSENSITIVE, // ⏮️ 可滚动游标 ResultSet.CONCUR_READ_ONLY)) { stmt.setString(1, "IT"); // 📌 永远用参数化查询防注入 stmt.setFetchSize(100); // 🧠 分批获取结果 ResultSet rs = stmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("EMP_NAME")); } }
conn.setAutoCommit(false); // 🎯 关键步骤! try (PreparedStatement stmt = conn.prepareStatement( "INSERT INTO ORDERS VALUES (?, ?, ?)")) { for (Order order : orderList) { stmt.setInt(1, order.getId()); stmt.setTimestamp(2, new Timestamp(order.getTime())); stmt.addBatch(); // 📦 攒批处理 if (i % 500 == 0) stmt.executeBatch(); // 每500条提交一次 } stmt.executeBatch(); conn.commit(); }
时区陷阱:DB2的TIMESTAMP默认用服务器时区,建议统一配置:
props.put("currentTimezone", "Asia/Shanghai");
LOB处理:大文本字段要用特殊API:
Clob clob = conn.createClob(); clob.setString(1, largeText); stmt.setClob(1, clob);
连接泄漏检测:
// 启动时加上JVM参数: -Dcom.ibm.db2.jcc.traceInputStream=true
DatabaseMetaData meta = conn.getMetaData(); ResultSet tables = meta.getTables(null, "DB2ADMIN", "%", new String[]{"TABLE"}); while (tables.next()) { System.out.println("发现表: " + tables.getString("TABLE_NAME")); }
CallableStatement cstmt = conn.prepareCall("{call PROC_GET_EMP(?, ?)}"); cstmt.setInt(1, 1001); cstmt.registerOutParameter(2, Types.VARCHAR); // 📌 注册输出参数 cstmt.execute(); String empName = cstmt.getString(2);
:
"现在小王终于明白,老张的代码之所以优雅,是把这些技巧玩成了肌肉记忆💪,建议收藏本文,下次连接DB2时直接翻出来对照实践!"
(本文信息参考自IBM DB2 2025年官方文档及JDBC 4.3规范)
本文由 捷寄蕾 于2025-08-02发表在【云服务器提供商】,文中图片由(捷寄蕾)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/516808.html
发表评论