Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HSQLDB:我试图用临时表中的一些数据填充一个表,但是数据被删除了_Java_Hsqldb - Fatal编程技术网

Java HSQLDB:我试图用临时表中的一些数据填充一个表,但是数据被删除了

Java HSQLDB:我试图用临时表中的一些数据填充一个表,但是数据被删除了,java,hsqldb,Java,Hsqldb,我正在使用HSQLDB。在java函数中,我创建了一个临时表,并用一些数据填充它。在使用临时表中的数据更新常规表之后 如果我调试函数内部的代码并执行SELECT,我可以看到两个表中的数据确实都已更新,但提交更改后,表不再更新!常规表,而不是临时表 当我创建临时表时,我使用了:ON COMMIT PRESERVE ROWS,但它没有帮助 有人知道为什么会这样吗 谢谢 代码如下: public synchronized void foo(String[] objectsToMark) throws

我正在使用HSQLDB。在java函数中,我创建了一个临时表,并用一些数据填充它。在使用临时表中的数据更新常规表之后

如果我调试函数内部的代码并执行SELECT,我可以看到两个表中的数据确实都已更新,但提交更改后,表不再更新!常规表,而不是临时表

当我创建临时表时,我使用了:ON COMMIT PRESERVE ROWS,但它没有帮助

有人知道为什么会这样吗

谢谢

代码如下:

public synchronized void foo(String[] objectsToMark) throws Exception {

        String createTempTableQuery = "CREATE TEMP TABLE "+TEMP_TABLE_NAME+"(OBJECTID VARCHAR) " +
                "ON COMMIT PRESERVE ROWS";
        String dropTempTableQuery = "DROP TABLE "+TEMP_TABLE_NAME;

        String updateQueryString = "update " + TABlE_A + " set " +TABlE_A+".X = 'N' where "+TABlE_A+".RESULT_ID in (select "+TABlE_A+".RESULT_ID FROM "+TABlE_A
                        +" inner join "+TABLE_B+" on "+TABLE_B+".OBJECTID = "+TABlE_A+".OBJECTID"
                        +" inner join TEMP_TABLE on "+TABLE_B+".OBJECTID = TEMP_TABLE.OBJECTID"
                        +" where "+TABlE_A+".IS_X = 'Y')";

        String insertObjectIDs = "INSERT INTO " + TEMP_TABLE_NAME + " (OBJECTID) VALUES (?)";
        Connection conn = null;
        Statement stmt = null;
        PreparedStatement psInsertObjectIDs = null;
        try {
            conn = getConnection(getClass().getName() + "");
            stmt = conn.createStatement();


            stmt.execute(createTempTableQuery);

            // insert object's IDs into table
            psInsertObjectIDs = conn.prepareStatement(insertObjectIDs);

            for (String id : objectsToMark) {
                int i = 0;
                psInsertObjectIDs.setString(++i, id);
                psInsertObjectIDs.addBatch();
            }
            psInsertObjectIDs.executeBatch();

            stmt.execute(updateQueryString);

        } catch (Exception e) {
        } finally {
            // close resources
            close(stmt);
            stmt = null;
            // drop the temporary tables
            if (conn != null) {
                try {
                    stmt = conn.createStatement();
                    stmt.execute(dropTempTableQuery);
                } catch (SQLException e) {
                }
                close(stmt);
            }

            close(psInsertObjectIDs);
            closeConnection(conn);
        }
    }

请注意,此处没有提交,但连接已配置为执行自动提交。

由于调试时代码正常工作,因此问题一定不在此代码范围内

如果您在file:database上作为独立测试运行此代码,并且您没有在jdbc连接url中指定写入延迟或关闭选项,那么引擎没有足够的时间将数据写入磁盘

HSQLDB的默认设置用于生产,其中由应用程序发出关闭。对于测试,请使用以下任一属性

此操作在每次提交或自动提交后写入更改,因此会降低生产数据库的速度:

jdbc:hsqldb:file:mydb;hsqldb.write_delay=false
当唯一剩余的连接关闭时,此连接将关闭数据库:

jdbc:hsqldb:file:mydb;shutdown=true

由于此问题经常出现,2.2.9版本的HSQLDB的未来版本将始终在唯一剩余连接关闭时将数据写入磁盘。

请报告您的代码!数据存储在哪里?我找不到它,只有一个空文件夹db.tmp。临时表的数据存储在内存中。会话设置允许将较大的临时表存储在.tmp目录内的文件中。请参阅指南。