【问题标题】:jtds.jdbc.JtdsConnection.createBlob java.lang.AbstractMethodErrorjtds.jdbc.JtdsConnection.createBlob java.lang.AbstractMethodError
【发布时间】:2021-09-27 12:17:29
【问题描述】:

mvn:net.sourceforge.jtds/jtds/1.3.1-patch-20190523/jar 保存到 Microsoft SQL Server 数据库。 实际上这个 JDBC 驱动是由 Talend 提供的。由于各种原因,我有一些将 blob 保存到数据库的 Java JDBC 代码。这适用于 Oracle 数据库。

try (Connection con = DriverManager.getConnection(this.connectionString, this.user, this.pw)) {

        insert(con, ags, snr, productVersion, nummer, inhalt, this.migrationsBenutzer, format, daten);
}

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 {
        Blob blob = con.createBlob();
        blob.setBytes(1, daten);
        PreparedStatement ps = con.prepareStatement(this.insert);
        ...
        ps.setBlob(9, blob);
        result = ps.executeUpdate();

但是,当我使用 jtds 的连接字符串调用该方法时: jdbc:jtds:sqlserver://:1433;databaseName=

我得到了这个异常

Exception in thread "main" java.lang.AbstractMethodError
    at net.sourceforge.jtds.jdbc.JtdsConnection.createBlob(JtdsConnection.java:2776)
    at de.iteos.dao.BildspeichernDAO.insert(BildspeichernDAO.java:60)

我能做什么?如果可行,我想尽可能保持该方法的通用性。我必须切换到另一个 JDBC 驱动程序吗?我在某处读到这可以通过验证查询来解决。为此,我必须为 Oracle 和 SQL Server 实现两个不同的数据源,对吗?

【问题讨论】:

    标签: jdbc jtds


    【解决方案1】:

    问题是 jTDS - 据我所知 - 不再维护,并且可用版本停留在 JDBC 3.0 (Java 1.4) 支持上。您尝试调用的方法Connection.createBlob 是在JDBC 4.0 (Java 6) 中引入的。尝试在针对 JDBC 3.0 API 编译的驱动程序上调用此方法将导致 AbstractMethodError,因为未实现 JDBC 4.0(或更高版本)中的方法。

    最简单最好的解决方案可能是切换到Microsoft SQL Server JDBC driver

    或者,您需要切换到 JDBC 3.0 选项来填充 blob,即使用 PreparedStatement.setBinaryStream(int, InputStream, int) 方法(不要与 JDBC 4.0 中引入的 setBinaryStream(int, InputStream)setBinaryStream(int, InputStream, long) 混淆!),或者可能setBytes(int, byte[]),或使用驱动程序特定的方法来创建 blob。

    您提到的验证查询解决方案不适用于此处,它解决了Connection.isValid 的问题,某些Tomcat 版本中的数据源实现默认调用,除非您配置验证查询。其根本原因相同(JDBC 4.0 中也引入了isValid 方法)。

    我不确定你的意思 “我必须为 Oracle 和 SQL Server 实现两个不同的数据源,对吗?”,你不能为两个不同的数据库使用同一个数据源,因此无论如何您都需要配置两个不同的实例。

    【讨论】:

    • 太棒了。它现在适用于 Oracle 和 MSSQL / JTDS 非常感谢!!!!!!
    猜你喜欢
    • 2020-04-08
    • 2019-03-30
    • 2020-01-25
    • 1970-01-01
    • 2021-04-18
    • 2015-12-23
    • 2011-10-23
    • 2013-08-15
    • 2012-12-10
    相关资源
    最近更新 更多