Java 應用通過 JDBC 訪問 Oracle 時,常遭遇連接緩慢、資料截斷、字符集亂碼等問題。本文針對三大高頻異常場景,提供經實戰驗證的解決方案與代碼最佳實踐。
現象:建立連接耗時極長,執行 SELECT 時拋出內部錯誤:
java.sql.SQLException: ORA-00600: internal error code, arguments: [ttcgcshnd-1], [0], [], [], [], [], [], []
根因:JDBC 驅動版本與資料庫版本不匹配,或使用了舊版 `classes12.jar`。
解決:
現象:向 `VARCHAR2(3000)` 欄位寫入長字符串時拋出:
java.sql.SQLException: Data size bigger than max size for this type: 3000
根因:`setString` 受限於 JDBC 實現的緩衝區大小,大字符串需使用流式寫入。
解決:改用 `setCharacterStream`
String sql = "INSERT INTO test(name, addr) VALUES (?, ?)";
try (PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setString(1, "kingfish");
// 建立字符流,避免 32767 字節限制
char[] carray = new char[1000];
Arrays.fill(carray, '我');
String longStr = new String(carray);
try (Reader reader = new StringReader(longStr)) {
pst.setCharacterStream(2, reader, longStr.length());
pst.executeUpdate();
}
}
關鍵點:
現象:中文存入資料庫變亂碼,或讀出顯示 `???`。
排查清單:
最佳實踐:統一使用 `AL32UTF8` (資料庫) + `UTF-8` (JVM `file.encoding`),避免 `ZHS16GBK` 等舊字符集。
public class OracleJdbcTest {
private static final String URL = "jdbc:oracle:thin:@localhost:1521:oradb";
private static final String USER = "system";
private static final String PWD = "manager";
public static void main(String[] args) {
testLargeTextInsert();
}
static void testLargeTextInsert() {
// ... 實現上述邏輯
}
}