【问题标题】:SQLite JDBC in Java Web App ServletJava Web App Servlet 中的 SQLite JDBC
【发布时间】:2015-07-17 06:10:02
【问题描述】:

我对开发 Web 应用程序比较陌生,我目前正在开发 Java servlet Web 应用程序,并且需要一个临时数据库来存储在作用域内运行的方法的输出。方法完成后,我将查询数据库以检索我需要的结果,然后将其返回到 servlet 以在网页中提供。由于数据库中会有很多 i/o,并且一旦方法完成就不需要持久化数据库,我认为像 SQLite JDBC 这样的轻量级数据库效果最好。 https://bitbucket.org/xerial/sqlite-jdbc/downloads

这是我计划用来实例化数据库的代码:

Connection c = null;
    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:test.db");
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Opened database successfully");

问题:SQLite 是否可以像这样运行,其中方法在作用域内时实例化数据库,然后在方法和线程完成后方法超出作用域时被删除?

【问题讨论】:

    标签: java sqlite servlets jdbc in-memory-database


    【解决方案1】:

    德克兰,

    您正在创建一个外部资源,它是与数据库的连接。您有责任在从方法返回之前关闭资源。幸运的是,Java 提供了一个很好的方法来做到这一点,使用try with resources。您可以执行以下操作:

    Class.forName("org.sqlite.JDBC"); try (final Connection c = DriverManager.getConnection("jdbc:sqlite:test.db");) { // ... write and read from the database } catch ( Exception e ) { System.err.println( e.getClass().getName() + ": " + e.getMessage() ); // -- do not exit yet: System.exit(0); } // ... don't forget to delete test.db

    此外,由于这是一个 servlet,您可能有多个线程创建同名文件。看看你是否能找到一种唯一命名数据库文件的方法。

    苏莱赫。

    【讨论】:

    • 谢谢 Sualeh。如果我理解正确,如果 test.db 在运行此方法之前不存在,SQLite 会实例化数据库吗?
    • 是的,SQLite 实例化了数据库。但是,请记住在完成后删除数据库文件。
    • 另外,看看如何在bitbucket.org/xerial/sqlite-jdbc/overview 上创建内存连接。不过,如上所述,您仍然需要关闭连接。
    • 好的,有道理。既然数据库是在建立连接的时候实例化的,那么如何将数据库分配给一个对象,以便调用delete方法呢?
    • 如果你使用内存连接(Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:");),你根本不需要“删除”任何东西!
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2017-05-07
    • 2014-03-31
    相关资源
    最近更新 更多