12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQLiteの書き込みを高速にする(EntityFrameworkCoreのMicrosoft.Data.Sqlite版)

Posted at

はじめに

EntityFrameworkCoreでSQLiteを使ってみようと思ったが、書き込み速度が遅かった。(実際は十分速いんだけど、大量のデータを保存する必要があって、さすがに時間がかかった…)
なんとか改善できないかいろいろ調べてみたところ、SQLiteの設定でやれることがあるっぽかった。

過去、System.Data.SQLiteの時代…
接続文字列でSyncModeとJournalModeを指定することで、書き込み速度を改善することができる。

しかし、EntityFrameworkCoreのMicrosoft.Data.Sqliteの時代で、この接続文字列の方法は使えない。

いろいろな経緯により、接続文字列で指定できるものが大幅に削除されてしまったようだ。

解決方法

もともとの接続文字列のやつは、接続時にプラグマを送信してくれている。それを手動でやればよい。
こうだ!!!!↓↓↓↓

await using var context = await _contextFactory.CreateDbContextAsync();
await using (var connection = context.Database.GetDbConnection())
{
    await connection.OpenAsync();
    await using var command = connection.CreateCommand();
    command.CommandText = "PRAGMA synchronous=OFF;PRAGMA journal_mode=WAL;";
    await command.ExecuteNonQueryAsync();
}

context.Database.AutoTransactionsEnabled = false;

// Addしまくる処理

Context作った後に、データベースのConnectionを取得する。
そこにプラグマを送り付ければOK

同期モードの設定のプラグマの名前は、sync_modeとかじゃなくてsynchronous
context.Database.AutoTransactionsEnabledfalseにしておけば完璧では。

ところで、設定を変えるということは、もちろんメリット以外にデメリットもある。よく確認して使ってください。
プラグマの詳細はここに。

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?