HSQLDB 神秘异常消息:“不支持功能”

Posted

技术标签:

【中文标题】HSQLDB 神秘异常消息:“不支持功能”【英文标题】:HSQLDB cryptic exception message: "feature not supported" 【发布时间】:2011-04-15 07:42:06 【问题描述】:

我有通过执行 PreparedStatement 插入数据库表的 JDBC 代码。当我在内存 HSQLDB 数据库上运行代码时(作为 JUnit 测试的一部分),我得到一个 SQLFeatureNotSupportedException,唯一的信息是消息“不支持功能”和供应商代码 -1500。我正在做的是对表的基本插入——我无法想象最新的 HSQLDB 不支持这一点。

我的代码:

public Observations saveOrUpdate(final Observations observations)

    try
    
        if (connection == null)
        
            connection = getJdbcTemplate().getDataSource().getConnection();
        

        // create the prepared statement
        String sql = "INSERT INTO " + Observations.TABLE_NAME +
                     " (OBS_YEAR, WINTER, SPRING, SUMMER, FALL, ANNUAL, DATA_TYPE, CREATED_DATE, UPDATED_DATE, " +
                     Observations.ID_COLUMN_NAME +
                     ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, observations.getYear());
        preparedStatement.setBigDecimal(2, observations.getJan());
        preparedStatement.setBigDecimal(3, observations.getFeb());
        preparedStatement.setBigDecimal(4, observations.getMar());
        preparedStatement.setBigDecimal(5, observations.getApr());
        preparedStatement.setBigDecimal(6, observations.getMay());
        preparedStatement.setString(7, observations.getDataType().toString());
        preparedStatement.setTimestamp(8, new Timestamp(observations.getCreatedDate().getTime()));
        preparedStatement.setTimestamp(9, new Timestamp(observations.getUpdatedDate().getTime()));
        preparedStatement.setLong(10, observations.getId());
        preparedStatement.executeUpdate(sql);

        return observations;
    
    catch (SQLException ex)
    
        throw new RuntimeException(ex);
    

任何人都可以提出可能是什么问题或我应该进一步调查的其他问题吗?提前感谢您的帮助。

--詹姆斯

【问题讨论】:

尝试发布更多信息:异常日志、您的 HSQLDB 版本(可能是 2.0)、您的 java 版本等。我正在搜索以帮助您。估计是jre和你的hsqldb的兼容性问题。 非常感谢,艾托。我正在使用 HSQLDB 2.0 JAR 文件。我正在运行代码作为 JUnit 4 测试的一部分。我从使用 1.6 JRE 的 Eclise IDE 启动它。 DataSource 是使用 Spring 配置的,我从 Spring JdbcTemplate 获取连接,我已配置到包含此代码的 DAO 类中。 【参考方案1】:

HSQLDB 的系统性问题通常是由于服务器与驱动程序版本不匹配(根据我的经验,任何不匹配都不会起作用)。

我主要怀疑这不是你的问题。既然你说数据库是“在内存中”,我猜服务器和驱动程序是同一个 .jar 文件。但万一我猜错了,我想我会把它扔在那里。

【讨论】:

因为这是推测,这不应该是对问题的评论而不是答案吗? @Jacob Tomaw -- 应该吗?我从未见过这样的指南。更重要的是,这个网站上 98% 的问题的答案不都是某种程度的猜测吗?如果提问者对自己的问题有足够的了解,不需要猜测来寻找原因,那他自己不就可能找到答案了吗? Willis 您的猜测是您的回答没有帮助。对我来说,提出可以为您澄清问题的问题会更有帮助,并且提问者会知道“当您说这是一个'内存中'数据库时,您的意思是数据库和测试是在同一个 JVM 中运行?”作为评论。回答该问题后,您可以提供明智的答案。【参考方案2】:

你需要调用preparedStatement.executeUpdate()(不带参数sql)。

你调用了PreparedStatement.executeUpdate(String sql)方法,根据JDBC规范,这是非法的。再次传递 SQL 语句实际上没有任何意义,因为您在创建 PreparedStatement 对象时已经传递了它。即使您传递相同的字符串,调用此方法也是不合法的。调用一个方法是不合法的有点奇怪:-) 但这就是它的方式。在这种情况下,所有符合标准的 JDBC 驱动程序都需要抛出异常。

但我同意错误消息是神秘的。

【讨论】:

宾果游戏,你是赢家。非常感谢!【参考方案3】:

我在http://hsqldb.org/doc/changelog_1_7_2.txt找到的一些进一步信息:

The execute(String sql), executeUpdate(String sql) and executeQuery(String sql) 
commands are no-longer supported for PreparedStatements according to JDBC specs. 
Use an ordinary Statement for calling these methods.

【讨论】:

以上是关于HSQLDB 神秘异常消息:“不支持功能”的主要内容,如果未能解决你的问题,请参考以下文章

SQLSyntaxErrorException:由于 HSQLDB 中的“COALESCE”导致的数据类型异常

如何让 HSQLDB 在从 .script 文件初始化数据源期间发出错误消息?

hsqldb 不支持列的 columnDefinition 属性

HSQLDB:重复的列名,不支持的内部操作:类型,强制转换字符无效

JDBC URL 中不支持 HSQLDB default_table_type

hsqldb 中的间隔格式异常无效,但查询在 Postgres 中有效