1

質問: 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"
4

2 に答える 2

0

データ ソースで正しいドライバーを使用していますか? 正しく設定していますか?それは、私たちが見ていないコード (または構成) の部分です。

また、上記のユーザーが言ったように、スタック トレースなどを出力して、例外がスローされているかどうかを確認します。また、Statement の execute メソッドが true を返すか false を返すかを知っておくとよいでしょう。

于 2012-12-30T17:18:48.257 に答える