Java, многопоточночть, Sqlite

182
26 октября 2017, 07:18
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class vacuum {
    public static void connect(String str) {
        Connection conn = null;
        Statement stmt = null;
        try {
            String url = "jdbc:sqlite:/data/" + str;
            conn = DriverManager.getConnection(url);
            stmt = conn.createStatement();
            stmt.executeUpdate("VACUUM");
            System.out.println(str + "ok.");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    public static void main(String[] args) {
        String str = "db1.lgd";
        connect(str);
    }
}

Есть несколько Sqlite баз, которым нужно делать вакум. Хочу делать вакум всем база в нескольких паралелльных потоках. Т.е. в метод connect передавать список баз из массива и сам метод запускать в отдельном потоке. Выше, рабочий код, который делать вакум для одной базы. Подскажите, это реализовать?

Answer 1

Нужно создать объект Thread, передать в него Runnable и запустить методом start, на Java 8 будет выглядеть так

public static void main(String[] args) {
    new Thread(()->connect("db1.lgd")).start();
    new Thread(()->connect("db2.lgd")).start();
}
Answer 2

Спасибо. Сделал так:

public class vacuum extends Thread {
public static void connect(String str) {
    Connection conn = null;
    Statement stmt = null;
    try {
        String url = "jdbc:sqlite:/data/" + str;
        conn = DriverManager.getConnection(url);
        stmt = conn.createStatement();
        stmt.executeUpdate("VACUUM");
        System.out.println(str + " ok.");
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } finally {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
}
public static void main(String[] args) {
    new Thread(()->connect("db1.lgd")).start();
    new Thread(()->connect("db2.lgd")).start();
}
}

Так время вакумизации занимает такое же время, если бы делать вакум каждой базы последовательно. Т.е. db1.lgd - 7 мин., db2.lgd - 2 минуты. Если в многопоточном режиме то теже 9 минут получаются.

READ ALSO
Tочное значение термина “unhandled exception”

Tочное значение термина “unhandled exception”

Какие исключения относятся к необработанным? Те, которые не были обёрнуты в try-catch? Исключение, которое создаётся в методе, объявленном с throws...

286
Как прочитать данные типа UInt8(Objective-C) в byte(Java)?

Как прочитать данные типа UInt8(Objective-C) в byte(Java)?

Извините, но я не знаю даже, как правильно вопрос задатьНужно сделать тестовое задание на языке Java для Android

304
Проектирование кода: использование return в switch

Проектирование кода: использование return в switch

Какой код с точки зрения проектирования более правильный

222
Spring BCryptPasswordEncoder некорректно работает

Spring BCryptPasswordEncoder некорректно работает

Я использую BCryptPasswordEncoder для шифрования пароля при регистрации на сайтеНо есть проблема, при логине пароль пользователя не подтверждается

278