安卓直连 SQL Server 这件事,安卓技术上是连接可行的,但坑比想象中多。据库我去年做过一个内部工具,源码需要让平板上的安卓 App 直接查公司内网的 SQL Server,绕不开 JDBC。连接Android 原生没有 JDBC 驱动,据库得手动把 jtds 或微软的源码 mssql-jdbc 塞进项目里。
先说驱动选择。安卓jTDS 是连接老牌方案,体积小,据库兼容 SQL Server 2005 到 2012 比较稳。源码微软官方的安卓 mssql-jdbc 从 6.0 版本开始才支持 Android,但要求 API 级别 21 以上,连接而且依赖了 java.sql 的据库一些边角类,打包时容易报重复类。我最后用的是 jTDS 1.3.1,jar 包不到 300KB,丢进 libs 目录,在 build.gradle 里加一行 implementation files('libs/jtds-1.3.1.jar') 就能用。
连接字符串格式是这样的:
String url = "jdbc:jtds:sqlserver://192.168.1.100:1433;databaseName=TestDB;user=sa;password=123456;"; Connection conn = DriverManager.getConnection(url);别急着复制。Android 主线程不允许网络操作,这段必须扔进子线程。我习惯用 ExecutorService 开一个单线程池,或者直接 new Thread 包起来。下面是一个能跑的最小示例:
new Thread(() -> { try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT TOP 10 * FROM Users"); while (rs.next()) { Log.d("DB", rs.getString("UserName")); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } }).start();实际跑起来会遇到几个典型问题。第一个是网络权限,AndroidManifest.xml 里必须加 android.permission.INTERNET,否则连不上还看不到明确报错。第二个是明文流量限制,Android 9 以后默认禁止 HTTP 明文传输,虽然 JDBC 走的是 TCP 不是 HTTP,但有些设备或定制 ROM 会误判,保险做法是在 manifest 的 application 标签里加 android:usesCleartextTraffic="true"。
第三个坑更隐蔽:SQL Server 的 TCP/IP 协议默认可能是禁用的。你得打开 Sql Server Configuration Manager,在“SQL Server 网络配置”里把对应实例的 TCP/IP 启用,并且确认端口是 1433。我那次折腾了一下午,一直报“连接被拒绝”,最后发现是服务器端 TCP 没开。
性能方面,直连 JDBC 在局域网内延迟大概 20 到 50 毫秒,查询几百行数据没问题。但别指望它做复杂联表或者大数据量拉取,Android 的 JDBC 驱动没有连接池,每次查询都新建连接,频繁操作会卡。我的做法是维护一个长连接,配合简单的连接有效性检查,比如每 30 秒发一次 SELECT 1。
安全上,明文密码写在代码里是下策。稍微正经一点的做法是把连接参数放在服务端接口里,App 通过 HTTPS 拿临时令牌,再拿令牌换数据库连接。但那样就不叫“直连”了。所以直连 SQL Server 只适合内网工具、演示原型,或者对安全要求不高的场景。真要上生产,还是走 API 网关更稳妥。
最后给一个容易忽略的细节:jTDS 在 Android 高版本上可能报 java.lang.NoClassDefFoundError: javax.naming.Referenceable。解决办法是在 proguard 规则里加 -dontwarn javax.naming.**,或者干脆关掉 minifyEnabled。我试过开混淆,折腾半天不如直接关掉省事。
这套方案我用了大半年,查报表、改配置都够用。你要是也打算这么干,先把服务器 TCP 端口和驱动版本确认好,剩下的就是写个线程池的事。
顶: 53171踩: 1






评论专区