使用 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 驱动程序执行 SQL Server 调用时出现“第 24 行位置的 JDBC 转义语法无效 '=' 预期字符”错误的原因?
JTDS 与 SQL Server 的连接问题 - 适用于 2000 但不适用于 2005