如何在Java应用程序中运行SQLite真空命令?
问题: 我想让我的Java应用程序手动运行SQLite真空命令?我在下面包括一段代码片段。我试着做一个准备好的陈述和一个直截了当的陈述。我也做了一个广泛的网络搜索的解决方案,并没有找到相关的例子 发生了什么事? 当我运行代码时,系统暂停。查看目录,执行代码时文件大小不会减小。记录集也返回false 但是,如果我通过Firefox运行SqlItemManager并运行Compact数据库,则该数据库会进行压缩。注意:我在压缩之前复制了一份DB,这样我就可以看到大小上的差异 健全性检查 --我确保数据库被所有其他应用程序(包括SQLItemManager)关闭。 --没有正在运行的已知事务。 --没有抛出异常 代码片段: 我把测试代码放在里面。这不是生产代码,因此错误处理等可用,但最小如何在Java应用程序中运行SQLite真空命令?,java,sqlite,Java,Sqlite,问题: 我想让我的Java应用程序手动运行SQLite真空命令?我在下面包括一段代码片段。我试着做一个准备好的陈述和一个直截了当的陈述。我也做了一个广泛的网络搜索的解决方案,并没有找到相关的例子 发生了什么事? 当我运行代码时,系统暂停。查看目录,执行代码时文件大小不会减小。记录集也返回false 但是,如果我通过Firefox运行SqlItemManager并运行Compact数据库,则该数据库会进行压缩。注意:我在压缩之前复制了一份DB,这样我就可以看到大小上的差异 健全性检查 --我确保数
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"
您是否在数据源中使用了正确的驱动程序?您是否正确配置了它?这是我们没有看到的代码(或配置)部分
另外,如上面用户所说,打印堆栈跟踪或其他内容,以便我们知道是否抛出异常。知道语句的execute方法返回true还是false会很好。我知道这已经很旧了,但如果每个人都需要它,它就会出现
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。因为真空不会返回任何东西,所以您可能应该使用
executeUpdate()
而不是execute()
。请不要捕捉(例外)。根据您发布的代码,不可能知道是否引发了异常。谢谢。我还尝试了executeUpdate()。这将返回0。我还更改了简单代码以捕获SQLException,而不仅仅是异常。没有抛出异常。另外,我注意到文件确实得到了更新(时间戳),但没有发生压缩/真空。我知道不会发生压缩,因为随后通过FireFox在SQLite Manager中运行会清理DB文件——相当明显。哦,我明白您关于catch exception的意思了。那只是简写为post。我的副本需要进行异常处理。很抱歉我更改以反映我的实际代码。(注意:代码已编辑——原始代码只有异常e,catch语句中没有输出)。问题是,这里的5个问题中有4个没有按其应该的方式处理异常。因此,由于您没有展示如何真正处理异常,我们不知道您是否真的按照您应该的方式处理它们,或者,正如通常的情况(以及您最初的问题中的情况),您只是忽略它们,隐藏了实际的问题。谢谢。我还为上面的连接添加了代码——参见附录。我没有看到任何例外。executeUpdate方法返回0,execute返回false。