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

Kotlin Android使用mssql-jdbc 12.2.0无SSL连接SQL Server失败求助

解决mssql-jdbc 12.2.0.jre11驱动Android无SSL连接SQL Server失败问题

问题概况

使用官方推荐的com.microsoft.sqlserver:mssql-jdbc:12.2.0.jre11驱动在Kotlin Android应用中连接SQL Server时,出现如下错误:

com.microsoft.sqlserver.jdbc.SQLServerException:The driver was unable to establish
a secure connection to SQL Server using SSL encryption. Error: "Socket is closed".

此前使用JDTS驱动可正常连接,且通过RemoDb测试手机端连接正常,排除SQL Server端配置问题。

当前配置与代码:

  • build.gradle依赖:
implementation "com.microsoft.sqlserver:mssql-jdbc:12.2.0.jre11"
  • 连接字符串:
val connectionUrl = "jdbc:sqlserver://192.168.1.56:1433;databaseName=akhasap_db;user=sa;password=123456;encrypt=false;trustServerCertificate=false;loginTimeout=30;"
  • 连接代码:
try {
       println("Connecting to SQL Server ... $connectionUrl")
       DriverManager.getConnection(connectionUrl).use { connection -> println("Done.") }
       Snackbar.make(view, "Connected", Snackbar.LENGTH_LONG).setAction("Action", null).show()
    } catch (e: Exception) {
       Snackbar.make(view, "Can't Connect to DB", Snackbar.LENGTH_LONG).setAction("Action", null).show()
       println("DkPrintError:"+e.toString())
       e.printStackTrace()
    }

解决步骤

1. 允许应用明文网络流量

Android 9(API 28)及以上默认禁止明文网络请求,无SSL的SQL Server连接属于明文通信,需在AndroidManifest.xml的<application>标签中添加:

android:usesCleartextTraffic="true"

2. 更换适配Android的驱动版本

jre11版本的驱动在Android ART环境下存在兼容性问题,建议切换到jre8版本:

implementation "com.microsoft.sqlserver:mssql-jdbc:12.2.0.jre8"

3. 调整连接字符串参数

确保无SSL连接的参数生效,可修改参数格式或补充配置:

val connectionUrl = "jdbc:sqlserver://192.168.1.56:1433;databaseName=akhasap_db;user=sa;password=123456;encrypt=no;sslProtocol=none;loginTimeout=30;"
  • 将encrypt=false替换为encrypt=no(部分驱动版本对参数值格式敏感)
  • 添加sslProtocol=none明确禁用SSL协议

4. 将连接操作移至子线程

Android禁止在主线程执行网络操作,主线程阻塞会导致Socket被强制关闭。使用协程切换到IO线程执行连接逻辑:

lifecycleScope.launch(Dispatchers.IO) {
    try {
        println("Connecting to SQL Server ... $connectionUrl")
        DriverManager.getConnection(connectionUrl).use { connection -> 
            println("Done.")
            // 更新UI需切回主线程
            withContext(Dispatchers.Main) {
                Snackbar.make(view, "Connected", Snackbar.LENGTH_LONG).show()
            }
        }
    } catch (e: Exception) {
        withContext(Dispatchers.Main) {
            Snackbar.make(view, "Can't Connect to DB", Snackbar.LENGTH_LONG).show()
        }
        println("DkPrintError:" + e.toString())
        e.printStackTrace()
    }
}

5. 排查依赖冲突

执行./gradlew app:dependencies查看项目依赖树,排除可能存在的JDBC相关依赖冲突。

内容的提问来源于stack exchange,提问作者Dowlpack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:13:14