Skip to content

如何连接SQL Server 2008 R2数据库

连接外部 SQL Server 2008 数据库时连接重置,会出现Connection Reset的错误

问题现象

连接外部 SQL Server 2008 数据库时连接重置,会出现Connection Reset的错误。

问题根因

Java 6u29 中引入了一个 Bug,可阻止与 SQL Server 2008 R2 的 SSL 连接。

Oracle 在 6u30 中提供了一个修复程序,但 Java 1.7 也无法正常工作。

用户可以通过降级 Java 版本(1.6.0_24 版本已确认可以使用)或向 Java 传递以下属性和值来解决这个错误:-Djsse.enableCBCProtection=false.

详情参考:

https://confluence.atlassian.com/fishkb/java-sql-sqlexception-i-o-error-connection-reset-when-connecting-to-an-external-sql-server-2008-database-284365810.html

修改JRE安全配置

SQL Server 2008 R2使用的TLS 1.0,而JRE默认使用的是TLS 1.2,所以需要修改JRE安全配置,否则会报错。 找到JRE安装目录下的${JRE_HOME}\lib\security\java.security

bash
// 修改前
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL

// 修改后
jdk.tls.disabledAlgorithms=RC4, DES, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL

修改启动配置文件

Windows

修改${CHINLINK_HOME}\windows.service.xml,然后重启服务

bash
//修改前
<env name="JAVA_OPTS" value="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"/>
//修改后
<env name="JAVA_OPTS" value="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Djsse.enableCBCProtection=false"/>

修改${CHINLINK_HOME}\.configure.cmd,然后重启服务

bash
//修改前
@SET JAVA_OPTS=-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai
//修改后
@SET JAVA_OPTS=-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Djsse.enableCBCProtection=false

Linux

修改${CHINLINK_HOME}/.configure.sh,然后重启服务

bash
//修改前
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
//修改后
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Djsse.enableCBCProtection=false"

修改配置参数

打开项目>设置>主要设置>服务启动选项,添加 -Djsse.enableCBCProtection=false

修改启动参数

注意事项

在设置ConnectionString的时候,请默认添加trustservercertificate=true;参数。 连接参数