问题: 我想让我的 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"