33

每个驱动程序之间有什么区别?我的意思是,除了其中一个是开源的

每一个的优点/缺点是什么?

你会推荐哪一个?


这是 jTDS 对这个问题的看法:http: //jtds.sourceforge.net/

4

6 回答 6

20

它们是不同的实现。jTDS 驱动程序是 4 类驱动程序,以我的经验具有更好的性能。我在生产环境中使用 jTDS 驱动程序已经 5 年了,没有任何问题。

我建议使用 jTDS。

于 2010-12-09T14:25:56.020 回答
11

虽然多年来 jTDS 比有缺陷的 mssql 自己的驱动程序要好得多,但最近情况正在发生相反的变化。

这是来自https://confluence.atlassian.com/bitbucketserver/transitioning-from-jtds-to-microsoft-s-jdbc-driver-776640388.html的引用:

为什么要更换驱动程序?

最近发布的 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。

于 2018-10-05T14:08:22.093 回答
3

一个相关的区别是,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 不是一个选项。

于 2014-10-27T17:11:20.613 回答
3

使用 jTDS 的关键原因是它使用较少的 GPL 许可证,而微软的驱动程序使用他们自己的许可证,这对它有更多的限制。需要注意的一个限制是,您不得

  • 解决软件中的任何技术限制

许可证中有更多限制,例如:

  • 将软件或本协议转让给任何第三方
  • 将该软件用于商业软件托管服务

这可以解释为您可能不会在生产代码中使用它,但是许可证中的早期点似乎允许它。

说了这么多,我不知道 SQL Server 本身中的许可证可能会或可能不会限制第三方驱动程序(例如 jTDS 连接到它)。

另一点是 jTDS 可以通过 maven 获得,而 Microsoft 驱动程序不是。

<dependency>
    <groupId>net.sourceforge.jtds</groupId
    <artifactId>jtds</artifactId>
    <version>1.3.1</version>
</dependency>

对于我的选择,使用 jTDS,它更宽松,最不可能给你带来麻烦,并且;这是一个更好的驱动程序。

于 2016-05-18T08:15:51.533 回答
2

jTDS 性能不错,但看起来 jTDS 不支持故障转移属性,如果 SQL Server 切换到辅助服务器,则需要重新启动应用程序/服务器以选择新 ip 并重置连接。

于 2018-09-13T14:00:44.597 回答
0

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
于 2021-10-14T15:11:17.763 回答