0

私はデータベースをバックアップし、データベースを毎回送信するサーバーを持っています...ところで、毎回50MBのデータベースを送信する必要はありません私は次のような小さなプログラムを行いました

delete from table where timestamp < ?

データベースの最後のタイムスタンプを取得し、次のバックアップのために保存して、最新のデータのみを送信できるようにします(50MBではなく数KB)

今、私は異なるバックアップをマージするための別のプログラムを作りたいです...私は挿入部分で「立ち往生」しています...

    public static void merge(String toMerge) {
Connection c, c2 = null;
Statement stmt, stmt2 = null;

try {
    Class.forName("org.sqlite.JDBC");
    c = DriverManager.getConnection("jdbc:sqlite:merge.db");
    System.out.println("Opened merge.db database successfully");
    c.setAutoCommit(false);
    stmt = c.createStatement();
    c2 = DriverManager.getConnection("jdbc:sqlite:" + toMerge);
    System.out.println("Opened " + toMerge + " database successfully");
    stmt2 = c2.createStatement();

    ResultSet rs = stmt2.executeQuery("SELECT * FROM messages;");
    String sql;
    while (rs.next()) {
    sql = "INSERT INTO messages";
    stmt.executeUpdate(sql);
    }
    rs.close();
    stmt2.close();
    c2.close();

    stmt.close();
    c.commit();
    c.close();
} catch (Exception e) {
    System.err.println(e.getClass().getName() + ": " + e.getMessage());
    System.exit(0);
}
System.out.println("Operation done successfully");

}

私は2 dbを開くことを考えていました... 1には標準名「merge.db」があり(そのようにして2 + dbをマージできます)、もう1つはマージするものです...この方法を使用するために2接続を開きます(各データベースに1つ)、db2からすべての行を読み取り、新しいデータベースに挿入します...しかし、ここでいくつかの問題があります

  1. データベースには多くの列があるため、200 getInt/String/Float を使用する必要があります
  2. 私はNULL値を持っています
  3. 私はたくさんの行を持っています

したがって、このメソッドを使用すると、挿入クエリを作成するために多くの変数と時間が必要になります... (今のところ、このメソッドを書いていますが、より簡単な方法があればもっと良いです...私はmakeを考えていましたすべての変数を含むクラスで、それを使用してSQL挿入を作成します..そのようにして、異なるテーブルに同じ関数を使用できます(他のクラスのクラスを拡張する必要があるだけです))

テーブルを編集する と、実際の int 文字列値が blob になります (合計 29 列)

4

1 に答える 1