質問: Java アプリケーションで SQLite VACUUM コマンドを手動で実行できるようにしたいですか? 以下にコード スニペットを含めます。私はPreparedStatementとして、そしてまっすぐなStatementとして試しました。また、解決策について広範な Web 検索を行いましたが、関連する例は見つかりませんでした。
何が起こるのですか? コードを実行すると、システムが一時停止します。ディレクトリを見ると、コードを実行してもファイルサイズは減少しません。RecordSet も false を返します。
しかし、Firefox 経由で SQLiteManager を実行し、Compact Database を実行すると、データベースは圧縮されます。注: サイズの違いを確認できるように、圧縮する前に DB のコピーを作成します。
サニティ チェック -- DB が他のすべてのアプリケーション (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"