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

时间:2016-09-23 10:50:25

标签: sql-server hibernate jpa spring-boot jtds

我使用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 个答案:

答案 0 :(得分: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。

这里有2个选项:

  1. 切换到支持此方法的Microsoft JDBC驱动程序
  2. 获取jTDS的源代码并自行实现该方法(最有可能通过将旧方法转发给新方法)
  3. 根据我的经验,不会很快指望官方发布。