每个驱动程序之间有什么区别?我的意思是,除了其中一个是开源的
每一个的优点/缺点是什么?
你会推荐哪一个?
这是 jTDS 对这个问题的看法:http: //jtds.sourceforge.net/
每个驱动程序之间有什么区别?我的意思是,除了其中一个是开源的
每一个的优点/缺点是什么?
你会推荐哪一个?
这是 jTDS 对这个问题的看法:http: //jtds.sourceforge.net/
它们是不同的实现。jTDS 驱动程序是 4 类驱动程序,以我的经验具有更好的性能。我在生产环境中使用 jTDS 驱动程序已经 5 年了,没有任何问题。
我建议使用 jTDS。
虽然多年来 jTDS 比有缺陷的 mssql 自己的驱动程序要好得多,但最近情况正在发生相反的变化。
为什么要更换驱动程序?
最近发布的 Hibernate(Bitbucket Server 用来简化其持久层)引入了要求,即使用的 JDBC 驱动程序和连接池符合 JDBC4。JDBC4 是在 Java 6 中引入的。
Bitbucket Server 2.1 之前的版本使用的 jTDS 驱动程序是 JDBC3 驱动程序,与 Java 1.3 兼容,因此不能与较新版本的 Hibernate 一起使用。虽然 jTDS 1.3.0 和 1.3.1 声称实现了 JDBC4 和 JDBC4.1,但实际上并没有。新方法已经“实现”了,但是它们的实现都是 throw new AbstractMethodError(),这意味着它们实际上不能被使用。(请参阅此处的示例,在 GitHub 上。)
由于 jTDS 1.3.1 不提供功能正常的 JDBC4 实现,因此决定用 Microsoft 自己的 SQL Server 驱动程序替换 jTDS。Microsoft 的驱动程序得到积极维护,其中 jTDS 自 2014 年以来未更新(在 2014 年进行的小轮更新之前,它已多年未更新)。Microsoft 提供完整的 JDBC4.2 (Java 8) 驱动程序并支持 SQL Server 的所有功能,包括 SQL Server 2016。
一个相关的区别是,JTDS-Driver (v1.3.1) 的 JDBC 4.0 实现至少需要 Java 7,而 Microsoft 驱动程序的 JDBC 4.0 实现在 Java 6 中可用。
如果您想使用 Hibernate 4.3(依赖 JDBC 4.0 API)并支持 Java 6,这一点很重要。在这种情况下,JTDS 不是一个选项。
使用 jTDS 的关键原因是它使用较少的 GPL 许可证,而微软的驱动程序使用他们自己的许可证,这对它有更多的限制。需要注意的一个限制是,您不得
- 解决软件中的任何技术限制
许可证中有更多限制,例如:
- 将软件或本协议转让给任何第三方
- 将该软件用于商业软件托管服务
这可以解释为您可能不会在生产代码中使用它,但是许可证中的早期点似乎允许它。
说了这么多,我不知道 SQL Server 本身中的许可证可能会或可能不会限制第三方驱动程序(例如 jTDS 连接到它)。
另一点是 jTDS 可以通过 maven 获得,而 Microsoft 驱动程序不是。
<dependency>
<groupId>net.sourceforge.jtds</groupId
<artifactId>jtds</artifactId>
<version>1.3.1</version>
</dependency>
对于我的选择,使用 jTDS,它更宽松,最不可能给你带来麻烦,并且;这是一个更好的驱动程序。
jTDS 性能不错,但看起来 jTDS 不支持故障转移属性,如果 SQL Server 切换到辅助服务器,则需要重新启动应用程序/服务器以选择新 ip 并重置连接。
jTDS 1.3.1(最新发布的版本)存在 TLS 问题,这对某些人来说可能会改变游戏规则。问题可能是从 Java 8 开始的——我看到了这样的评论——但它没有得到验证。有一个“私人”,未发布修复 - 参见例如https://community.microfocus.com/cyberres/idm/w/identity_mgr_tips/19661/enforcing-ssl-tlsv1-2-jdbc-connection-via-jtds-jdbc-司机 它对我有用。您可以在下面找到尝试使用原始 jTDS 1.3.1 和 TLS 连接到 MS SQL 时生成的异常:
java.sql.SQLException: Network error IOException: Connection reset
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:436)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at jtds.JtdsMain.getData(JtdsMain.java:30)
at jtds.JtdsMain.start(JtdsMain.java:15)
at jtds.JtdsMain.main(JtdsMain.java:9)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at net.sourceforge.jtds.ssl.TdsTlsInputStream.readFully(TdsTlsInputStream.java:131)
at net.sourceforge.jtds.ssl.TdsTlsInputStream.primeBuffer(TdsTlsInputStream.java:100)
at net.sourceforge.jtds.ssl.TdsTlsInputStream.read(TdsTlsInputStream.java:78)
at sun.security.ssl.InputRecord.readFully(Unknown Source)
at sun.security.ssl.InputRecord.read(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at net.sourceforge.jtds.ssl.SocketFactories$TdsTlsSocketFactory.createSocket(SocketFactories.java:101)
at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:330)
at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:577)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:365)
... 6 more