You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:00:22