0

サーバーから JSON を解析し、ORMLite を使用して、オブジェクトを読み込んでデータベースに永続化します。ファイルは非常に大きくなる可能性があるため、何百ものオブジェクトをメモリに読み込んで一括コミットするのではなく、オブジェクトを一度に 1 つずつコミットすることを考えています (結局のところ、スマートフォンではメモリが不足しています)。ただし、各オブジェクトには複数の値を持つコレクションが含まれており (ForeignCollectionこれらの値に使用しようとしているため、各値を個別のオブジェクトとして扱う必要があります)、オブジェクトのコレクション内のすべてのアイテムを一度にコミットする方がよいと考えます。 、たとえば、個々の文字列または整数をコミットするのではなく。

バッチでコミットのグループを作成するには、単純に を呼び出しdao.setAutoCommit(false)dao.create()各項目を呼び出し、dao.commit()後で呼び出しdao.setAutoCommit(true)てから、断片的なコミットに戻るために を呼び出すと思います。

3 つの質問があります。

  1. 途中でコミットするのは正しいですか、それともバッチ コミットを行うべきですか? たとえ最大で 1000 個のオブジェクトが一度にコミットされることを意味するとしても?
  2. アイテムのコレクションを一度に 1 つずつコミットするのと、バッチでコミットするのとではどちらがよいでしょうか?
  3. databaseConnectionそれから値を取得しdao.setAutoCommit()て必要とする場所はどこdao.commit()ですか? 見逃したのかもしれませんが、ドキュメントや例では見つかりません。
4

1 に答える 1

2

途中でコミットするのは正しいですか、それともバッチ コミットを行うべきですか? たとえ最大で 1000 個のオブジェクトが一度にコミットされることを意味するとしても?

多数のアイテムがある場合は、1,000 オブジェクトではなく、100 個のオブジェクトを一度にコミットする方がよい場合があります。オブジェクトのサイズに大きく依存するため、さまざまなバッチサイズで実行し、それらのタイミングを調整することをお勧めします。おっしゃるとおり、メモリとデータベースのパフォーマンスのバランスを取る必要があります。結果が知りたいので、タイミングデータをコメントしてください。

アイテムのコレクションを一度に 1 つずつコミットするのと、バッチでコミットするのとではどちらがよいでしょうか?

バッチで物事を行う方が確かに良いです。これは、私がこれまで取り組んできたほぼすべてのデータベースに当てはまります。

外部コレクションについて話している場合、オブジェクトの外部コレクションと、作成するオブジェクトの大きなリストとの間に違いはありません。どちらもバッチ処理の恩恵を受けます。

各外部オブジェクトが作成された後はコミットしません。私はむしろ、100 個 (たとえば) の外部オブジェクトと、それに関連する外部オブジェクトをまとめたいと考えています。次に、100 の変更をコミットし、次の 100 を実行します。次に、100 を 200 に変更してから、50 を試します。変曲点が表示されるはずです。

私はこれに正しく答えましたか?

それからdatabaseConnection値をどこで取得してdao.setAutoCommit()必要としdao.commit()ますか? 見逃したのかもしれませんが、ドキュメントや例では見つかりません。

編集#2:

@Chad が指摘したように、Android で自動コミットを使用することを推奨するのは間違っていました。Sqlite ドライバーは通常、トランザクションを開始し、完了したらコミットすることで、自動コミットをサポートします。ただし、Android はこれをサポートしていないようです。Android データベース接続では、コードはノーオペレーションです。

Android では、ORMLite でバッチ タスクを実行する適切な方法は、代わりにdao.callBatchTasks(Callable)メソッドを使用することです。何かのようなもの:

accountDao.callBatchTasks(connectionSource,
  new Callable<Void>() {
    public Void call() throws SQLException {
        // insert a number of accounts at once
        for (Account account : accountsToInsert) {
           // update our account object
           accountDao.create(account);
        }
        return null;
    }
});
于 2012-05-10T21:34:51.750 に答える