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

Exception while using jtds for SqlServer connectivity

我正在使用 jtds 驱动程序从 UnixBox 连接到 SQLServer,使用来自 SpringBoot+JPA 应用程序的 windows 身份验证。它是一个独立的应用程序,而不是基于 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 容器而不是默认容器选择吗?或者是否还有其他可用选项?

Edit : JtdsPreparedStatement 有一个默认作用域的构造函数;甚至不能延长它

有一个开放的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

区别在于最后一个参数从长整型改为整型。

jTDS 还没有实现 Hibernate 使用的新方法,因此你得到了 AbstractMethodError。

这里有 2 个选项:

  1. 换成微软JDBC驱动,支持此方法
  2. 获取 jTDS 的源代码并自己实现方法(很可能是将旧方法转发给新方法)

根据我的经验,不要指望很快就会有正式版本。