1

问题: 我想让我的 Java 应用程序手动运行 SQLite VACUUM 命令?我在下面包含一个代码片段。我尝试过作为 PreparedStatement 和直接声明。我还对解决方案进行了广泛的网络搜索,但没有找到相关示例。

怎么了? 当我运行我的代码时,系统会暂停。查看目录,执行我的代码时文件大小没有减小。RecordSet 也返回 false。

但是,如果我通过 Firefox 运行 SQLiteManager 并运行紧凑型数据库,那么数据库确实是紧凑型的。注意:我在压缩之前制作了数据库的副本,以便可以看到大小的差异。

健全性检查 ——我确保数据库被所有其他应用程序(包括 SQLiteManager)关闭。--没有已知的事务正在运行。--不抛出异常。

代码片段: 我将测试代码保存在里面。这不是生产代码,因此错误处理等可用但很少。

try {
    Connection conn = db.getConnection() ;
    StringBuilder sql = new StringBuilder() ;
    sql.append("VACUUM");

    //PreparedStatement prep = conn.prepareStatement(sql.toString()) ;
    Statement stat = conn.createStatement() ;
    boolean rs = stat.execute(sql.toString()) ;

    System.out.println("Executed vacuum " + rs ) ;     

    //Testing code--preparedstatement attempts
    //conn.setAutoCommit(false);
    //boolean rs = prep.execute() ;
    //conn.setAutoCommit(true);

    } catch (Exception e) {
       //Edited back in after posting to StackOverflow
        System.out.println(
                ".SQLiteVacuum :: exception " + 
                e.getMessage() + " " + e.getClass().getName() );
        e.printStackTrace() ;
    }

交叉引用 Java 1.6+ SQLite 3+ Xerial JDBC 驱动程序

附录

private final String dbJDBCdriverclassname = "org.sqlite.JDBC" ;
private final String dbJDBCpreconnectionstring = "jdbc:sqlite:" ;
        // Setup the driver reference
        Class.forName(dbJDBCdriverclassname) ; //"org.sqlite.JDBC"

        // Create the connection string
        String connstring = dbJDBCpreconnectionstring + this.getDBConnectionFullFileName() ;

        // create the connection
        dbconnection = 
                DriverManager.getConnection(connstring) ; // "jdbc:sqlite:test.db"
4

2 回答 2

2

我知道这已经很老了,但是如果每个人都需要这里,那就去吧。

Statement stmt = null;
ResultSet rs = null;
try {
    Connection conn = DBConnection.getConnection();//something to get a connection
    stmt = conn.createStatement();
    stmt.executeUpdate("VACUUM");
} catch (SQLException ex) {
    //Something if you like, or not you're the boss!
} finally {
    DBConnection.closeResources(rs, stmt);//something to close all the resources
}

有了这个片段,我在 185KB 的测试数据库中节省了 63KB。

于 2017-04-17T21:57:35.183 回答
0

您是否在数据源中使用了正确的驱动程序?您是否正确配置它?那是我们没有看到的代码(或配置)的一部分。

此外,如上述用户所说,打印堆栈跟踪或其他内容,以便我们知道是否引发了异常。很高兴知道 Statement 的 execute 方法是返回 true 还是 false。

于 2012-12-30T17:18:48.257 回答