はじめに
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.AutoTransactionsEnabled
もfalse
にしておけば完璧では。
ところで、設定を変えるということは、もちろんメリット以外にデメリットもある。よく確認して使ってください。
プラグマの詳細はここに。