更新表时 H2 数据库“重命名文件时出错”

Posted

技术标签:

【中文标题】更新表时 H2 数据库“重命名文件时出错”【英文标题】:H2 database "Error while renaming file" when updating a table 【发布时间】:2011-02-02 10:25:14 【问题描述】:

我正在使用最新版本的 H2,即版本 1.3.150,并且在更新 VARCHAR2 时收到 org.h2.jdbc.JdbcSQLException。

SQL语句很简单

UPDATE STAMP_TABLE SET DESCRIPTION='a bit of text' WHERE STAMPID='s/1'

而表本身并没有什么特别之处,就是一堆VARCHAR2和一个BLOB

它第一次工作,第二次失败并显示错误消息:

Error while renaming file "C:\my\local\path\1.t6.lob.db" to "C:\my\local\path\1.temp.lob.db"

使用SQL语句的方法如下:

public void updateStampDescription(StampId stampId, String description) throws SQLException 

    PreparedStatement stmt = null;

    try 

        stmt = conn.prepareStatement(UPDATE_STAMP_DESCRIPTION);
        stmt.setString(1, description);
        stmt.setString(2, stampId.getId());

        logger.debug("SQL statement: " + stmt.toString());

        stmt.execute();

    
    catch(SQLException ex)
        logger.error("Error while updating table " + STAMPS_TABLE_NAME + ", description column: " + ex.getMessage() );
        ex.printStackTrace();
        throw ex;
    
    finally 
        if(stmt!=null) stmt.close(); // Also closes the ResultSet
    


知道有什么问题吗?

【问题讨论】:

您能否也发布堆栈跟踪(包括根本原因)?这是一台Windows机器吗?我知道尝试重命名仍然打开的文件时的问题(基本上,你不能在 Windows 上)。在任何情况下,可以通过将数据库升级到新格式来解决这个问题,其中 BLOB 存储在数据库中而不是外部文件 - 请参阅h2database.com/html/tutorial.html#upgrade_backup_restore @Thomas,关于 Windows 的好点子,因为我还没有在 Linux 上看到过这种情况。 【参考方案1】:

我会回答我自己的问题:

实际上,该项目位于 Dropbox 文件夹中,当时 Dropbox 正在使用这些文件,因此无法按照 H2 的要求重命名。

【讨论】:

很高兴知道问题出在哪里,谢谢!对于 H2,计划是尽可能删除那些外部文件。 H2 版本 1.3 不再为 BLOB 和 CLOB 数据创建单独的文件。在某些情况下(大型查询、大型事务)仍会创建一些临时文件,删除它们需要更长的时间。 1.3版确实在这个问题上做了很大的改进,即使还有一些临时文件,很高兴知道你们正在努力。

以上是关于更新表时 H2 数据库“重命名文件时出错”的主要内容,如果未能解决你的问题,请参考以下文章

提供多个表时,简单连接在 H2 数据库中不起作用

H2:打开连接,更新,关闭连接,现在我所有的更改都消失了吗?

H2 - 使用 SQL 语句“SELECT * FROM null T”访问链接表时出错

Hibernate/H2 外键抛出 org.h2.jdbc.JdbcSQLException

[h2两个数据库同步更新]h2数据库配置多个连接

使用 Laravel 5 更新数据库表时,有没有办法保留数据?