HSQLDB不保存通过Java进行的更新

时间:2017-09-07 12:58:49

标签: java hsqldb

我正在尝试通过Java将记录添加到HSQL数据库中的表。

我有一个通过OpenOffice创建的HSQL数据库,将.odb文件重命名为.zip并将SCRIPT和PROPERTIES文件(目前没有数据)解压缩到我的java项目中的文件夹“\ database”夹。

该表在SCRIPT文件中如下所示

CREATE CACHED TABLE PUBLIC."Season"("SeasonID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Year" VARCHAR(50))

到目前为止一切正常,数据库在Java中与此代码连接得很好:

public void connect(){
    try{
        String dbName = "database\\db";

        con = DriverManager.getConnection("jdbc:hsqldb:file:" + dbName, // filenames prefix
                "sa", // user
                "");  // pass

    }catch (Exception e){
            e.printStackTrace();
    }
}

我有以下代码将记录插入“季节”。

public void addSeason(String year){

        int result = 0;

        try { 
            stmt = con.createStatement(); 
            result = stmt.executeUpdate("INSERT INTO \"Season\"(\"Year\") VALUES ('" + year + "')"); 
            con.commit(); 
            stmt.close();
        }catch (Exception e) { 
            e.printStackTrace(); 
        } 

        System.out.println(result + " rows affected");
}

我有一个名为printTables()的最终函数:

private void printTables(){
    try { 
        stmt = con.createStatement(); 
        ResultSet rs = stmt.executeQuery("SELECT * FROM \"Season\"");
        System.out.println("SeasonID\tYear");
        while(rs.next()){
            System.out.println(rs.getInt("SeasonID") + "\t\t" + rs.getString("Year"));
        }
    }catch (Exception e) { 
        e.printStackTrace(System.out);
    }
}

现在如果我运行这个函数序列:

connect();
printTables();
addSeason("2010");
printTables();

我得到了这个输出:

SeasonID    Year
1 rows affected
SeasonID    Year
0       2010

现在,当我关闭程序并再次启动它时,我得到完全相同的输出。因此,第一次运行期间所做的更改尚未保存到数据库中。有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

它是由hsqldb中的写延迟参数引起的,默认情况下从内存到文件的延迟同步时间为500毫秒。

当问题设置为假时,问题就解决了

statement.execute("SET FILES WRITE DELAY FALSE");

或根据您的应用行为进行设置。

答案 1 :(得分:0)

所以我的解决方法是在每次更新后关闭连接,然后在我想要做其他事情的时候打开新连接。

这是非常令人不满意的,如果我想在更新期间执行查询,我肯定以后会导致问题。也是浪费时间。

如果我能找到一种方法来确保在程序被杀死时调用con.close()就可以了......