jtds调用createBlob存Blob到SQL Server报AbstractMethodError如何解决
问题根因
你遇到的AbstractMethodError是jTDS 1.3.x版本驱动本身的功能限制导致的:该驱动未实现JDBC 4.0规范定义的Connection.createBlob()接口方法,和数据源验证查询无关,验证查询无法解决该类接口未实现的错误。
解决方案
方案1:不换驱动、不拆分两套实现,1行代码改造兼容所有场景(推荐)
你不需要通过createBlob()构造Blob对象再写入,直接调用PreparedStatement的setBytes()方法写入字节数组即可,该方法是所有主流JDBC驱动(包括Oracle驱动、jTDS驱动、SQL Server官方驱动)通用支持的能力,对Blob类型字段完全兼容,改造后代码可以同时适配Oracle和SQL Server,不需要任何分支判断。
改造后的代码示例:
public long insert(Connection con, String ags, String snr, int productVersion ,int nummer,String inhalt, String benutzer, String format, byte[] daten) throws SQLException { long result = 0; String timestamp = now(); try { PreparedStatement ps = con.prepareStatement(this.insert); // 省略前面的参数赋值逻辑 // 删掉原来的createBlob、setBlob两行,直接用setBytes写入字节数组 ps.setBytes(9, daten); result = ps.executeUpdate(); // 后续原有逻辑保持不变
方案2:更换SQL Server JDBC驱动
如果你确实有必须使用Blob对象的场景(比如需要写入超过JVM堆内存的超大Blob数据、需要分批写入Blob内容等),可以将SQL Server侧的驱动更换为微软官方维护的mssql-jdbc驱动,该驱动完整实现了JDBC 4.0及以上版本的所有接口,原有createBlob()的逻辑不需要任何修改即可正常运行,同时也不需要拆分两套DataSource实现,原有适配Oracle的逻辑完全可以复用。
关于是否需要两套DataSource的说明
不需要。不管选择上述哪种方案,都可以保留一套通用的DAO实现和DataSource配置:
- 选择方案1的情况下,一套代码可以同时兼容Oracle和jTDS驱动连接的SQL Server
- 选择方案2的情况下,原有
createBlob()逻辑可以同时在Oracle驱动、SQL Server官方驱动下正常运行,不需要做分支适配
内容的提问来源于stack exchange,提问作者Hans
相关产品推荐
相关产品推荐

