ms sql microsoft的jdbc驱动和jTDS的驱动的区别
Posted
技术标签:
【中文标题】ms sql microsoft的jdbc驱动和jTDS的驱动的区别【英文标题】:differences between ms sql microsoft's jdbc drivers and jTDS's driver 【发布时间】:2011-05-22 13:56:54 【问题描述】:每个驱动程序之间有什么区别?我的意思是,除了其中一个是开源的
各有什么优缺点?
你会推荐哪个?
这里是 jTDS 自己对这个问题的看法:http://jtds.sourceforge.net/
【问题讨论】:
我无法想象选择 Microsoft Java 集成组件而不是 jTDS 之类的东西。 Atlassian 的 Confluence 文档建议在连接到 SQL Server 时使用 JTDS 而不是 MS JDBC jar... 看到这个问题:***.com/questions/1186932/using-jtds-driver 感谢您的链接,斯蒂芬,我确实在 SO 上进行了搜索,但我似乎错过了这个问题...... “除了其中一个是开源的” - Microsoft 的 SQL Server JDBC 驱动程序现在是 open-source 并且正在积极开发中。 【参考方案1】:它们是不同的实现。 jTDS 驱动程序是 4 类驱动程序,以我的经验具有更好的性能。我在生产环境中使用 jTDS 驱动程序已经 5 年了,没有任何问题。
我建议使用 jTDS。
【讨论】:
Microsoft SQL Server JDBC 驱动程序也是类型 4 驱动程序。虽然它在过去几年有所改进,但仍不如 jTDS 好和稳定。 而对 XA 的支持总是涉及本机 SQL 服务器端组件 Microsoft SQL Server JDBC driver is now open source 也是如此。 请考虑 JTDS 驱动自 2013 年以来未更新,仅支持 JDBC 3.0。Microsoft 驱动实现 JDBC 4.3 (docs.microsoft.com/en-us/sql/connect/jdbc/…),存在于 Java 11 版本中。【参考方案2】:一个相关的区别是,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 不是一个选项。
【讨论】:
【参考方案3】:使用 jTDS 的关键原因是它使用较少的 GPL 许可证,而 Microsoft 的驱动程序使用他们自己的许可证,这对它有更多的限制。需要注意的一个限制是您不能
解决软件中的任何技术限制
许可证中有更多限制,例如:
将软件或本协议转让给任何第三方 将该软件用于商业软件托管服务
这可以解释为您可能不会在生产代码中使用它,但是许可证中的早期部分似乎允许它。
说了这么多,我不知道 SQL Server 本身内的许可证可能会或可能不会限制第三方驱动程序,例如 jTDS 连接到它。
另外一点是jTDS可以通过maven获得,微软驱动不行。
<dependency>
<groupId>net.sourceforge.jtds</groupId
<artifactId>jtds</artifactId>
<version>1.3.1</version>
</dependency>
对于我的选择,使用 jTDS,它更宽松,最不可能给你带来麻烦,并且;这是一个更好的驱动程序。
【讨论】:
自 2016 年 11 月起,Microsoft 驱动程序可在 Github 上以 MIT 许可证:github.com/Microsoft/mssql-jdbc 和 Maven Central 上的 groupId "com.microsoft.sqlserver" 下使用【参考方案4】:jTDS 性能不错,但看起来 jTDS 不支持故障转移属性,如果 SQL Server 切换到辅助服务器,则需要重新启动应用程序/服务器以选择新 ip 并重置连接。
【讨论】:
【参考方案5】:虽然多年来 jTDS 比有缺陷的 mssql 自己的驱动程序要好得多,但最近情况正在发生相反的变化。
这是来自https://confluence.atlassian.com/bitbucketserver/transitioning-from-jtds-to-microsoft-s-jdbc-driver-776640388.html的qoute:
为什么要更换驱动程序?
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,它们实际上没有。新方法 已经“实现”了,但是它们的实现都是新的 AbstractMethodError(),这意味着它们实际上不能被使用。 (看 一个例子here, on GitHub。)
由于 jTDS 1.3.1 不提供正常运行的 JDBC4 实现, 决定用微软自己的 SQL Server 代替 jTDS 司机。 Microsoft 的驱动程序得到积极维护,而 jTDS 没有 自 2014 年以来已更新(并且在完成小轮更新之前 在 2014 年,它已经多年没有更新了)。微软提供了一个 完整的 JDBC4.2 (Java 8) 驱动程序并支持 SQL 的所有功能 服务器,包括 SQL Server 2016。
【讨论】:
是的,jTDS 已经过时了。去年我将一个应用程序升级到 java 8 并发现在 java 8 中使用 jTDS 和 SSL 时存在一个错误。尽管自 2014 年以来在 jTDS sourceforge 论坛中出现了关于工作补丁的错误报告,但驱动程序仍未更新以修复它。我必须构建自己的副本以包含修复程序。现在这周我发现了另一个错误。查询 datetime2 列时,getMetaData 将列类型错误地报告为 nvarchar。 microsoft 驱动程序正常工作。【参考方案6】: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-driver 它对我有用。 您可以在下面找到尝试使用原始 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
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于ms sql microsoft的jdbc驱动和jTDS的驱动的区别的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException:找不到适合 jdbc:microsoft:sqlserver 的驱动程序
如何对通过 MS JDBC 驱动程序运行的 MS SQL Server 查询强制执行查询超时?
SQL 异常:在 Android Studio 中使用 MS JDBC 时没有合适的驱动程序