如何在Java应用程序中运行SQLite VACUUM命令?

时间:2012-12-30 17:13:23

标签: java sqlite

问题: 我想允许我的Java应用程序手动运行SQLite VACUUM命令?我在下面添加了一个代码段。我已经尝试过PreparedStatement和直接声明。我还做了一个广泛的网络搜索解决方案,没有找到相关的例子。

会发生什么? 当我运行我的代码时,系统暂停。查看目录,执行代码时文件大小不会减少。 RecordSet也返回false。

但是,如果我通过Firefox运行SQLiteManager并运行Compact Database,那么数据库就会紧凑。注意:我在压缩之前复制了数据库,因此我可以看到尺寸的差异。

完整性检查 - 我确保所有其他应用程序(包括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"

2 个答案:

答案 0 :(得分:1)

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

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。

答案 1 :(得分:0)

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

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