【问题标题】:Loading SQLite db to memory in Java using JDBC?使用 JDBC 将 SQLite db 加载到 Java 中的内存?
【发布时间】:2019-10-04 16:36:35
【问题描述】:

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

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

例如,这个问题描述了如何使用python实现这一点:How to load existing db file to memory in Python sqlite3?

但是我不知道如何使用 JDBC 在 Java 或 Scala 中实现相同的功能。

有什么想法吗?

【问题讨论】:

  • “从文件加载到内存中”是什么意思?
  • @MarkRotteveel 我已经为问题添加了更多细节(尽管在这种情况下,问题对于那些知道答案的人来说是显而易见的)
  • 别打扰了。真的不值得努力。只需使用 pragma 增加缓存大小和 mmap 大小。
  • 值得付出努力,否则我不会问。我还需要预先加载而不是延迟加载。
  • 您可以使用 JDBC 驱动程序将内存数据库与 sqlite 一起使用,请参阅stackoverflow.com/questions/8831514/sqlitehow-to-use-in-memory 这使您的问题更像是“我如何备份和恢复 sqlite 数据库”或“我如何复制” sqlite 数据库的内容”。 JDBC 本身没有类似的东西,所以你需要一些特定于 sqlite 的东西。

标签: java scala sqlite jdbc


【解决方案1】:

我刚刚尝试使用 Xerial 的 sqlite-jdbc-3.27.2.1.jar,似乎他们让我们将 restore from 一个本机(二进制)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);
}

【讨论】:

  • 性能大幅提升,将 400ish mb 文件加载到内存中只需一秒钟。
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 2015-07-02
  • 1970-01-01
  • 2014-04-11
  • 2021-05-04
  • 2013-08-12
  • 2019-11-14
  • 1970-01-01
相关资源
最近更新 更多