我正在尝试通过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
现在,当我关闭程序并再次启动它时,我得到完全相同的输出。因此,第一次运行期间所做的更改尚未保存到数据库中。有什么我想念的吗?
答案 0 :(得分:1)
它是由hsqldb中的写延迟参数引起的,默认情况下从内存到文件的延迟同步时间为500毫秒。
当问题设置为假时,问题就解决了
statement.execute("SET FILES WRITE DELAY FALSE");
或根据您的应用行为进行设置。
答案 1 :(得分:0)
所以我的解决方法是在每次更新后关闭连接,然后在我想要做其他事情的时候打开新连接。
这是非常令人不满意的,如果我想在更新期间执行查询,我肯定以后会导致问题。也是浪费时间。
如果我能找到一种方法来确保在程序被杀死时调用con.close()就可以了......