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
相关产品推荐
相关产品推荐

