使用 jtds 进行 SqlServer 连接时出现异常

Posted

技术标签:

【中文标题】使用 jtds 进行 SqlServer 连接时出现异常【英文标题】:Exception while using jtds for SqlServer connectivity 【发布时间】:2017-02-01 04:58:24 【问题描述】:

我正在使用 jtds 驱动程序通过 SpringBoot+JPA 应用程序的 Windows 身份验证从 UnixBox 连接到 SQLServer。它是一个独立的应用程序,而不是基于 Web 的应用程序。我能够成功连接到相同的设备,但是当我尝试使用 JPARepository 保存一些数据时,我收到以下异常:

java.lang.AbstractMethodError: null
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.setCharacterStream(JtdsPreparedStatement.java:1274) ~[jtds-1.3.1.jar:1.3.1]

查看了JtdsPreparedStatement中对应的源码,发现没有这个方法的实现:

@Override
public void setCharacterStream(int parameterIndex, Reader reader,
        long length) throws SQLException 
    // TODO Auto-generated method stub
    throw new AbstractMethodError();

如建议here;我们可以实现相同的,它应该可以工作。有人可以解释一下如何注册我的 JtdsPreparedStatement 实现,以便在运行时由 Spring 容器而不是默认容器选择?或者是否有其他可用选项?

编辑JtdsPreparedStatement 有一个默认作用域的构造函数;甚至不能扩展它

【问题讨论】:

【参考方案1】:

为此有一个开放的jTDS bug。总之,JDBC标准规定了两种不同的设置字符流的方法:

旧方法签名:

public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException

新方法签名:

public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException

不同之处在于最后一个参数从 long 更改为 int。

jTDS 没有实现 Hibernate 使用的新方法,因此您会得到 AbstractMethodError。

你有两个选择:

    切换到支持此方法的 Microsoft JDBC 驱动程序 获取 jTDS 的源代码并自己实现方法(很可能通过将旧方法转发到新方法)

根据我的经验,不要指望很快就会正式发布。

【讨论】:

以上是关于使用 jtds 进行 SqlServer 连接时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 的 SQL Server 连接 - JTDS

jTDS 连接 URL [关闭]

通过 JTDS 驱动程序执行 SQL Server 调用时出现“第 24 行位置的 JDBC 转义语法无效 '=' 预期字符”错误的原因?

JTDS 与 SQL Server 的连接问题 - 适用于 2000 但不适用于 2005

c3p0 连接池 - 尽管 minPoolSize 为 10,但仅启动了一个 jTDS 进程

jTDS Java连接SQL Server 2000数据库