测试SQL Server连接报版本不支持错误,更换jar包无效如何解决
SQL Server连接报"The server version is not supported"排查方案
针对节点PF1RJRMENode06上server1服务数据源C连接失败、报错DSRA0010E: SQL State = 08S01, Error Code = 0的问题,按以下顺序排查,不要盲目尝试所有JDBC包,避免类冲突干扰排查:
- 第一步:先确认目标数据库的真实版本和连接地址正确性
找能正常连通该数据库的客户端,执行SELECT @@VERSION;拿到准确版本号,同时确认数据库实例的IP、端口、实例名。很多场景下这个报错是连错了实例:比如同机器装了多个SQL Server实例,误连到SQL Server 7.0等低于2000的老实例,甚至把同端口的其他数据库服务当成SQL Server连接,驱动读取不到正确的版本标识就会抛该错误。可以在server1所在服务器执行telnet 数据库IP 数据库端口确认网络可达,再用sqlcmd直连验证端口对应的实例版本。 - 第二步:清理中间件类路径冲突,匹配对应版本的JDBC驱动
从报错码DSRA0010E判断你用的是WebSphere中间件,这类中间件自带的JDBC驱动优先级高于你手动上传的包,先把节点下server1类路径里所有残留的sqljdbc*.jar、jtds*.jar全删除,只留一个和数据库版本匹配的驱动包:- 目标库为SQL Server 2000:使用jTDS 1.2.x或微软官方SQL Server JDBC 1.2驱动,高版本驱动已移除2000版本支持,连接必报该错
- 目标库为SQL Server 2005/2008/R2:使用jTDS 1.3.x或微软JDBC 3.0/4.0驱动,4.2及以上版本不再支持2005
- 目标库为SQL Server 2012及以上:使用对应匹配的微软JDBC 4.2+版本,不要用1.x/2.x的老驱动连接
配置JDBC提供程序时注意核对驱动类名:jTDS驱动类为net.sourceforge.jtds.jdbc.Driver,微软官方驱动类为com.microsoft.sqlserver.jdbc.SQLServerDriver,模板选错、类名填错也会触发版本不支持的误报。
- 第三步:排查TLS握手失败导致的误报
SQL Server 2016及以上版本默认开启TLS 1.2强制加密,不支持TLS 1.2的老版本驱动在握手阶段会被直接断开连接,驱动无法读取服务器版本,就会抛出该误导性错误。可以先在JDBC连接串追加参数encrypt=false;trustServerCertificate=true;测试,如果连接成功说明是加密协议不匹配,要么升级支持TLS 1.2的驱动版本,要么对齐数据库和JVM的TLS协议配置。 - 第四步:查看JVM日志定位根因
直接去WebSphere对应profile的logs路径下,找server1的SystemOut.log和SystemErr.log,定位报错堆栈的Caused by字段,确认是类加载失败、TLS握手失败还是连接超时导致的版本读取失败,不要只看表层错误提示。
高频踩坑点:不要同时放多个版本的SQL Server JDBC包在类路径下,WebSphere的类加载机制会优先加载先扫描到的类,哪怕你放了正确版本的包,只要有老版本的残留类被加载,就会持续报版本不支持错误。
内容的提问来源于stack exchange,提问作者Navaj Shaikh
相关产品推荐
相关产品推荐

