问题: 我想允许我的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"
答案 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。