关于JDK6兼容sql server2016的兼容问题

本文是记录本人,在实际开发项目中,遇到的一个兼容性问题;项目的运行环境是JDK6(公司项目,无法修改版本),而数据库确实sql server2016,之前还遇到sql server2000的,都是兼容性问题,很让人头疼。

正常来说,低版本sql server用sqljdbc.jar,高版本用sqljdbc4.jar(貌似从sql server2005版开始),配置驱动类是不一致的,具体细节,自行查找。

我的项目环境:JDK1.6,SQL SERVER2016

出现的问题描述:当JDK版本为1.6时,正常调用sqljdbc4.jar包的启动类,获取数据库连接时,会直接报错;而当JDK版本为1.7时,却没有问题;

以下是,JDK1.6+SQL SERVER2016+sqljdbc4.jar启动类,调用时,直接报错;

而JDK1.6+SQL SERVER2008+sqljdbc4.jar启动类,这样调用是没有问题的。

警告: TDSChannel ( ConnectionID:13 TransactionID:0x0000000000000000) SSL handshake failed: java.lang.RuntimeException: Could not generate DH keypair
com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误: java.lang.RuntimeException: Could not generate DH keypair。
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(Unknown Source)
	at com.microsoft.sqlserver.jdbc.TDSChannel.throwSSLConnectionFailed(Unknown Source)
	at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:185)
	at org.hyena.hr.rs.business.daos.ExEmployeeInfoDaoImpl.getExCompListForApps(ExEmployeeInfoDaoImpl.java:45)
	at org.hyena.hr.webservice.EmpInfoServiceImpl.exCompListForApps(EmpInfoServiceImpl.java:228)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:212)
	at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117)
	at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
	at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
	at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
	at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
	at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665)
	at java.lang.Thread.run(Thread.java:619)

分析:这里不一定是对的,因为本人也不太确定,这里就随意看看吧

sqljdbc4.jar:官网下载和说明:官网驱动JAR包下载

个人理解可能是,sql server2016和JDK1.6环境是,通过sqljdbc4.jar根本不适用,兼容不了,所以失败。

解决方案:换JAR包,直接弃用sqljdbc.jar或sqljdbc4.jar作为驱动包,因为这需要兼容不同版本的SQL SERVER,并且不同版本的SQL SERVER又与不同版本的JDK有兼容问题,所以直接放弃,换用另一种驱动包;使用jtds.jar就可以解决这个问题,相关配置如下:

这里我用了JNDI的方式来获取数据源,相关的配置写法不一样,并且配置文件写在TOMCAT中而已,其中用到的启动类是一样的。

第一种是sqljdbc的方式:

<Resource auth="Container" name="jdbc/PowerBIData" type="javax.sql.DataSource"
		maxActive="50" maxIdle="30" maxWait="5000" username="kj" password="kj@123"
		driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
		url="jdbc:sqlserver://192.168.90.80:1434;DatabaseName=PowerBIData;SelectMethod=cursor"
		validationQuery="select 0" />

第二种是JTDS的方式:

<Resource name="jdbc/PowerBIData" auth="Container" type="javax.sql.DataSource" 
	maxActive="30" maxIdle="20" maxWait="10000"  validationQuery="select 0" 
	username="kj" password="kj@123" driverClassName="net.sourceforge.jtds.jdbc.Driver"  url="jdbc:jtds:sqlserver://192.168.90.80:1434;DatabaseName=PowerBIData;SelectMethod=cursor"/>

这里只是换JAR包,极大的省去了修改代码和环境配置等麻烦事,之后,代码运行也没有问题。

注释:之前查看过这两篇文章,文章1是教人如何配置JDK1.6,文章2是换JAR包,但是并不适用;

文章1:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

文章2:驱动程序无法使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误: RSA premaster secret error

文章写得有误请协助指出,本人也没有研究的很深入,请谅解,谢谢。

猜你喜欢

转载自blog.csdn.net/qq_33172029/article/details/81914568