Android应用通过JDBC连接Oracle数据库遇SDU不匹配异常求助
解决Android JDBC连接Oracle时的SDU不匹配错误
错误原因
SDU(Size Data Unit)是Oracle网络传输的数据块大小,当客户端与服务器端的SDU配置不一致时,会抛出java.sql.SQLException: Io exception: Size Data Unit (SDU) mismatch异常。
修复方案
1. 在JDBC URL中指定SDU参数
修改连接URL,强制客户端使用与服务器一致的SDU大小(服务器默认通常为8192,可根据实际配置调整):
// 完整DESCRIPTION格式(兼容性更好) private static final String URL = "jdbc:oracle:thin:@(DESCRIPTION=(SDU=8192)(ADDRESS=(PROTOCOL=TCP)(HOST=myipaddress)(PORT=1521))(CONNECT_DATA=(SID=XE)))"; // 简化参数格式(部分驱动版本支持) private static final String URL = "jdbc:oracle:thin:@myipaddress:1521:XE?oracle.net.sdu=8192";
2. 确认服务器SDU配置
通过Oracle查询语句获取服务器当前SDU值,确保客户端设置与之一致:
SELECT value FROM v$parameter WHERE name = 'sdu_size';
3. 匹配JDBC驱动版本
确保使用的Oracle JDBC驱动与服务器版本兼容,例如Oracle 11g对应ojdbc6,12c对应ojdbc7/8,避免因版本差异导致的兼容性问题。
代码优化建议
- 移除主线程网络请求许可:
StrictMode.permitAll()会导致主线程阻塞,建议改用异步任务执行数据库操作(示例用Coroutine):public void buttonConnectToOracleDB(View view) { new Thread(() -> { try { Class.forName(DRIVER); Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); Statement statement = connection.createStatement(); // 移除无用的order by子句(count(*)无需排序) ResultSet resultSet = statement.executeQuery("select count(*)" + "from tms_full_report a where staff_id = '081049' and in_stat = 'Late IN' and " + "a.day_mm = to_char(sysdate,'MM') and " + "a.day_yyyy = to_char(sysdate,'YYYY')"); final String count = resultSet.next() ? resultSet.getString(1) : "0"; // 切换回主线程更新UI runOnUiThread(() -> { textView.setText(count); Toast.makeText(MainActivity.this, "CONNECTED", Toast.LENGTH_LONG).show(); }); connection.close(); } catch (Exception e) { runOnUiThread(() -> { textView.setText(e.toString()); Toast.makeText(MainActivity.this, "Not CONNECTED", Toast.LENGTH_LONG).show(); Log.v("debug=", e.toString()); }); } }).start(); }
内容的提问来源于stack exchange,提问作者kazutoodan game
相关产品推荐
相关产品推荐

