java - 从 jTDS JDBC 驱动程序迁移到 Microsoft JDBC

标签 java sql-server jdbc jtds mssql-jdbc

Microsoft 最近发布了一个新的 JDBC 驱动程序(版本 6.0.7507.100),其中包含一些非常有趣的功能。我最感兴趣的是 TVP 功能。这就是为什么我想用 Microsoft 驱动程序替换当前的 jTDS 驱动程序。

尝试登录我们的生产服务器时出现问题。假设我们使用域用户“mydomain\dbuser”登录到 sql server 实例。这是我们目前使用的 jtds jdbc url:

jdbc:jtds:sqlserver:/sqlServer:1433/myDb;domain=mydomain;user=dbuser;password=secretPwd

它就像一个魅力。

但是当我尝试使用 Microsoft 驱动程序时,我的应用程序无法与数据库建立连接。我尝试了以下 URL 字符串:

jdbc:sqlserver://sqlServer:1433;database=myDb;username=dbuser;password=secretPwd
jdbc:sqlserver://sqlServer:1433;database=myDb;username=mydomain\dbuser;password=secretPwd
jdbc:sqlserver://sqlServer:1433;database=myDb;username=dbuser@mydomain;password=secretPwd

和许多其他排列但没有成功。该应用程序失败,出现以下异常:

com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 'mydomain\dbuser'

在 SQL Server 日志中,我们收到以下错误:

Login failed for user 'mydomain\dbuser'. Reason: Attempting to use an NT account name with SQL Server Authentication. [CLIENT: 10.10.10.10]

请注意,该应用程序应该在 Linux 下运行。

有人知道以域用户身份连接时 Microsoft JDBC URL 应该是什么样子吗?

最佳答案

我对这个问题的研究得出了以下结论:

  • 从 jTDS 驱动程序到 Microsoft 驱动程序的简单转换是不可能的,正如我在问题中预期的那样。这是因为 jTDS 驱动程序实现了 Microsoft 驱动程序不可用的 NTLM 身份验证。
  • 另一种方法是使用 Linux 机器上可用的 JavaKerberos 身份验证方案(正如 Gord Thomson 所建议的)。幸运的是,我们在生产环境中设置了 Kerberos 基础架构。

主要是在这些 Microsoft(博客)帖子的帮助下,我成功地在我的服务中添加了 Kerberos 身份验证:

所以我将使用它。

关于java - 从 jTDS JDBC 驱动程序迁移到 Microsoft JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56424996/

相关文章:

java - ExchangeTimedOutException : The OUT message was not received

SQL - 如何使用插入的输出来更新表

java - PostgreSQL/JDBC - 如何准备调用带有参数 CITEXT (TEXT) 的函数?

java - 监控 JDBC 调用

scala - Derby 和 Circumflex ORM 的 SQL 语法错误

java - 使用Comparator.comparing(HashMap::get)作为比较器时发生意外行为

java - Android Kotlin `.replaceRange` 不会替换 SpannableString 中的文本

java - Presto JDBC 大型查询极慢

sql - 复制记录时更新

SQL 连接到相关子查询,其中表通过重叠范围相关