使用JDBC在Java中将SQLite数据库加载到内存中?

4

通常SQLite数据库会从文件中读取。如果数据库足够大,每个操作都可能需要进行文件I/O操作,这可能会很慢。

然而,SQLite提供了一种将数据库加载到内存中的方法-可以使用类似于jdbc:memory...的JDBC url访问它。

例如,这个问题描述了如何在Python中实现此目标:How to load existing db file to memory in Python sqlite3?

但是我无法弄清楚如何在Java或Scala中使用JDBC实现相同的事情。

有任何想法吗?


2
“从文件加载到内存”是什么意思? - Mark Rotteveel
@MarkRotteveel 我已经在问题中添加了更多细节(尽管对于那些知道答案的人来说,这个问题是显而易见的)。 - Ali
不要费力了,这真的不值得。只需使用编译指示增加缓存大小和mmap大小即可。 - Shawn
这个值得付出努力,否则我就不会提出要求了。我还需要它被预先加载而不是懒加载。 - Ali
您可以使用JDBC驱动程序与sqlite一起使用内存数据库,参见https://dev59.com/n2oy5IYBdhLWcg3wA5aC。 这使得您的问题更多是“如何备份和恢复sqlite数据库”或“如何复制sqlite数据库的内容”。 JDBC本身没有这样的功能,因此您需要一些特定于sqlite的工具。 - Mark Rotteveel
1个回答

9

我刚刚尝试了Xerial的sqlite-jdbc-3.27.2.1.jar,看起来他们让我们可以像这样从本机(二进制)SQLite数据库文件中恢复到 :memory:数据库:

try (Connection conn = DriverManager.getConnection("jdbc:sqlite::memory:")) {
    try (Statement st = conn.createStatement()) {
        st.execute("restore from C:\\__tmp\\thing.sqlite");

        // let's see if we can read one of the tables
        ResultSet rs = st.executeQuery("SELECT * FROM Table1");
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
    }

} catch (Throwable e) {
    e.printStackTrace(System.err);
}

性能大幅提升,仅需不到一秒的时间即可将约400MB的文件加载到内存中。 - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接