gpt4 book ai didi

java - HSQLDB:我试图用临时表中的一些数据填充一个表,但数据正在被删除

转载 作者:行者123 更新时间:2023-11-30 11:45:37 25 4
gpt4 key购买 nike

我正在使用 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);
}
}

注意这里没有提交,但是连接被配置为执行自动提交。

最佳答案

由于代码在您调试时可以正常工作,因此问题一定出在这段代码之外。

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

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

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

jdbc:hsqldb:file:mydb;hsqldb.write_delay=false

当唯一剩余的连接关闭时,这个将关闭数据库:

jdbc:hsqldb:file:mydb;shutdown=true

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

关于java - HSQLDB:我试图用临时表中的一些数据填充一个表,但数据正在被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com