2

有没有办法获得sqlite 'VACUUM' 的进度?我在 Java 中使用这行代码:

connection1.createStatement().executeUpdate("VACUUM");

用户( MySelf & I)必须等待几秒钟到几分钟,我知道实际的 .db 文件正在通过执行命令创建的日志文件的帮助下被覆盖。

可以使用 JAVA IO 或其他东西进行估算吗?谢谢您的帮助..

4

2 回答 2

1

不。SQLite C API 有一个进度处理程序,但它可能不会被您的 Java 驱动程序公开,并且真空处理是通过一种不同的机制实现的,无论如何都不报告进度。

您可以尝试查看数据库文件和任何临时文件的当前大小,但实际上不可能获得后者的名称。

于 2016-04-15T09:16:25.520 回答
1

我找到了我的问题的答案。所以我知道实际 .db文件的大小,我在javaFX中编写了一个服务,它每 50 毫秒计算一次.db-journal 文件的大小。所以我经常检查日志文件的大小查看如何根据实际 .db 文件构建 % :

package windows;

import java.io.File;

import javafx.concurrent.Service;
import javafx.concurrent.Task;

 /** Get the progress of Vacuum Operation */
public class VacuumProgress extends Service<Void> {

File basicFile;
File journalFile;

/**
 * Starts the Vacuum Progress Service
 * 
 * @param basicFile
 * @param journalFile
 */
public void start(File basicFile, File journalFile) {
    this.basicFile = basicFile;
    this.journalFile = journalFile;
    reset();
    start();
}

@Override
protected Task<Void> createTask() {
    return new Task<Void>() {
        @Override
        protected Void call() throws Exception {

            System.out.println("Started...");

            long bfL = basicFile.length();
            while (!journalFile.exists()) {
                Thread.sleep(50);
                System.out.println("Journal File not yet Created!");
            }
            long jfL = journalFile.length();

            while (jfL <= bfL) {
                updateProgress(jfL = journalFile.length(), bfL);
                Thread.sleep(50);
            }

            System.out.println("Exited Vacuum Progress Service");
            return null;
        }

    };
}

}
于 2016-05-18T18:02:54.667 回答