【问题标题】:Exception while using jtds for SqlServer connectivity使用 jtds 进行 SqlServer 连接时出现异常
【发布时间】: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 有一个默认作用域的构造函数;甚至不能扩展它

【问题讨论】:

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


    【解决方案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。

    你有两个选择:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多