在論壇發問「請大神幫我看看問題出在哪裡」卻只貼一張截圖、不提供代碼、資料庫結構、錯誤堆疊、預期與實際行為,這類提問幾乎無法獲得有效解答。本文整理提問必備要素,助你快速定位問題、提高解答率。
orders 表)CREATE TABLE 或欄位型別說明。| 陷阱 | 徵兆 | 排查重點 |
|---|---|---|
| Statement/PreparedStatement 重複使用未關閉 | 資料庫連線洩漏、後續查詢卡死 | 每次迴圈建立新 PreparedStatement,或使用批次更新 addBatch()/executeBatch() |
| 事務未提交 | 資料查不到、但無報錯 | 確認 conn.commit() 或 @Transactional 邊界 |
| 主鍵衝突/唯一鍵重複 | 拋出 Duplicate entry 例外 | 檢查 ID 生成策略、是否誤把同一物件重複插入 |
| 資料型別不符 | Data truncation、SQLIntegrityConstraintViolationException | 核對 Java 型別與資料庫欄位型別、長度 |
String sql = "INSERT INTO orders (user_id, amount, created_at) VALUES (?, ?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
conn.setAutoCommit(false);
for (OrderDTO dto : orderList) {
ps.setLong(1, dto.getUserId());
ps.setBigDecimal(2, dto.getAmount());
ps.setTimestamp(3, Timestamp.valueOf(LocalDateTime.now()));
ps.addBatch();
}
ps.executeBatch();
conn.commit();
} catch (SQLException e) {
// 處理回滾與日誌
}

「問題描述清楚,解決方案自然浮現。」下次發問前,請先用上述模板自查一次,往往能在整理過程中自己發現問題;即使最終仍需求助,完整資訊也能讓熱心人士在第一時間給出精準答案,雙贏。