Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java应用程序中运行SQLite真空命令?_Java_Sqlite - Fatal编程技术网

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

如何在Java应用程序中运行SQLite真空命令?,java,sqlite,Java,Sqlite,问题: 我想让我的Java应用程序手动运行SQLite真空命令?我在下面包括一段代码片段。我试着做一个准备好的陈述和一个直截了当的陈述。我也做了一个广泛的网络搜索的解决方案,并没有找到相关的例子 发生了什么事? 当我运行代码时,系统暂停。查看目录,执行代码时文件大小不会减小。记录集也返回false 但是,如果我通过Firefox运行SqlItemManager并运行Compact数据库,则该数据库会进行压缩。注意:我在压缩之前复制了一份DB,这样我就可以看到大小上的差异 健全性检查 --我确保数

问题: 我想让我的Java应用程序手动运行SQLite真空命令?我在下面包括一段代码片段。我试着做一个准备好的陈述和一个直截了当的陈述。我也做了一个广泛的网络搜索的解决方案,并没有找到相关的例子

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

但是,如果我通过Firefox运行SqlItemManager并运行Compact数据库,则该数据库会进行压缩。注意:我在压缩之前复制了一份DB,这样我就可以看到大小上的差异

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

代码片段: 我把测试代码放在里面。这不是生产代码,因此错误处理等可用,但最小

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。