我正在尝试在HsqlDB 2.3.4中为TEXT表禁用缓存,以便针对CSV文件的查询返回最新值而不是来自hsqdb内存的缓存值。
设置cache_rows=0
会引发IllegalArgumentException,并将其设置为1似乎无效。 cached_rows
设置可能会重置为默认值(10000行)或最小值(100行)。
如果不支持禁用缓存,是否可以在运行查询之前删除给定的表缓存甚至数据库缓存?似乎支持关闭数据库或删除整个架构,但这不是我想要实现的解决方法。
编辑1.示例代码
public static void main(String[] args) throws Exception {
String dir = args[0];
Class.forName("org.hsqldb.jdbc.JDBCDriver");
Connection conn = DriverManager.getConnection("jdbc:hsqldb:file:" + dir + "");
{
Statement st = conn.createStatement();
st.execute("DROP TABLE books IF EXISTS");
st.close();
}
{
Statement st = conn.createStatement();
st.execute("CREATE TEXT TABLE books (Title varchar(64), Author varchar(64))");
st.close();
}
{
Statement st = conn.createStatement();
st.execute("SET TABLE books SOURCE \"books.csv;ignore_first=true;cache_rows=1\"");
st.close();
}
for (int x = 0; x < 3; x++) {
System.out.println("iteration: " + x);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM books");
while (rs.next()) {
System.out.println(rs.getString(1) + " : " + rs.getString(2));
}
st.close();
Thread.sleep(15000L);
//data from files is cached, results shows original rows
//even after the file was modified on the file system
//need to execute source off/on to reload the data from files
}
conn.close();
}
答案 0 :(得分:1)
缓存用于提高查询速度,与修改后的数据无关。
您想要查询由外部程序生成的CSV文件。
以只读方式连接到该文件。如果要获取文件的更新版本,请使用此文件重新加载数据
SET TABLE XXX SOURCE OFF
SET TABLE XXX SOURCE ON