知識マップ: C#でSQLiteを業務アプリに使う ── WALモード・排他制御・破損対策・EF Coreとの使い分け

記事「C#でSQLiteを業務アプリに使う ── WALモード・排他制御・破損対策・EF Coreとの使い分け」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

C#でSQLiteを業務アプリに組み込むなら、ライブラリはMicrosoft.Data.Sqlite(または内部でそれを使うEF CoreのSQLiteプロバイダー)を選び、接続文字列も型の扱いも別物のSystem.Data.SQLiteと混同しない。WALモードを最初から有効にすると読み書きの並行性が上がりdatabase is lockedの大半が消え、残るSQLITE_BUSYもタイムアウトまでの自動リトライと、Channelsで書き込み経路を1本に寄せる設計で防げる。細かいINSERTは明示トランザクションでまとめるとコミットごとのfsyncコストが減り桁違いに速くなる。バックアップは稼働中の単純ファイルコピーを避けVACUUM INTOかBackupDatabaseを使い、quick_checkで破損を検知する。decimalはTEXTとして保存され比較が文字列規則になるため、金額は最小通貨単位の整数で持つのが安全である。

C#でSQLiteを運用する知識マップMicrosoft.Data.SqliteでSQLiteを業務アプリに組み込む際に、WALモードがSQLITE_BUSYを減らすこと、書き込み経路の一本化とトランザクションのまとめ方、バックアップと破損対策の正しい手段、decimal型のTEXT保存が引き起こす罠、EF Coreとの使い分けの関係を示す図両立しない利用する推奨される対応用いるのは非推奨軽減する軽減する軽減する軽減する利用する両立しない前提とする利用する原因になり得る防止する原因になり得る推奨される対応推奨される対応用いるのは非推奨原因になり得るで確認できる推奨される対応用いるのは非推奨推奨される対応原因になり得る防止する利用する原因になり得るMicrosoft.Data.SqliteWALモード(Write-Ahead Logging)System.Data.SQLiteMicrosoft.EntityFrameworkCore.Sqlite新規開発でのSQLiteライブラリ採用SQLITE_BUSY(database is locked)書き込み経路の一本化(Channelsによる書き込みキュー)明示的トランザクションによるINSERTのバッチ化コミットごとの同期書き込み(fsync)コスト稼働中DBファイルの単純ファイルコピーSQLCipherDPAPIMicrosoft.Data.Sqliteの接続プーリングプーリングによるDBファイルハンドルの保持SqliteConnection.ClearPoolSQLiteデータベースの破損VACUUM INTO稼働中SQLiteデータベースの一貫したバックアップ要件SqliteConnection.BackupDatabaseBackupDatabase完了までの書き込みブロックPRAGMA quick_checkSQLiteデータベース全体の暗号化要件アプリの秘密情報SQLiteの型マッピング(INTEGER/REAL/TEXT/BLOB)decimal列のTEXT保存による比較・集計の不整合金額を最小通貨単位の整数で持つ設計

概念間の関係(全27件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

Microsoft.Data.Sqlite
MicrosoftがメンテナンスするSQLite向けの軽量ADO.NETプロバイダーで、ネイティブのSQLite本体もNuGetパッケージに同梱される。
WALモード(Write-Ahead Logging)
変更をデータベース本体ではなく隣接する-walファイルへ追記していき、読み取りと書き込みを同時に進められるようにするSQLiteのジャーナリングモード。
Microsoft.EntityFrameworkCore.Sqlite
内部でMicrosoft.Data.Sqliteを使う、EF Core向けのSQLiteデータプロバイダー。
System.Data.SQLite
SQLite開発チーム系列の老舗ADO.NETプロバイダーで、接続文字列や型の扱いがMicrosoft.Data.Sqliteとは互換性のない別物。
書き込み経路の一本化(Channelsによる書き込みキュー)
複数スレッドが直接DBに書かず、System.Threading.Channelsのキューに投げて専任の書き込みループだけがコミットする設計。
明示的トランザクションによるINSERTのバッチ化
複数件のINSERTをBeginTransactionで囲みまとめてCommitすることで、コミットごとのfsyncコストを削減する手法。
SQLCipher
SQLiteデータベースファイル全体を透過的に暗号化する、標準のSQLiteネイティブライブラリを置き換える形の拡張。
Microsoft.Data.Sqliteの接続プーリング
バージョン6.0以降Microsoft.Data.Sqliteで既定有効になっている、接続のOpen/Closeを高速化する仕組み。
SqliteConnection.ClearPool
指定した接続文字列に対応する接続プールを破棄し、DBファイルのハンドルを解放するMicrosoft.Data.SqliteのAPI。
稼働中DBファイルの単純ファイルコピー
SQLiteのDBファイルが稼働中のまま、OSのファイルコピー機能でそのまま複製するバックアップ方法。
VACUUM INTO
元のファイルを変更せず、断片化を解消した一貫性のある最小サイズのコピーを別ファイルへ作成できるSQLiteのSQL文。
SqliteConnection.BackupDatabase
SQLiteのBackup APIをラップした、稼働中でも接続オブジェクト間で一貫したスナップショットを作成できるMicrosoft.Data.SqliteのAPI。
SQLiteデータベースの破損
ディスク障害や不適切なファイル操作によってSQLiteのファイル構造が壊れ、正しく読み書きできなくなる状態。
DPAPI
実行中のマシン上でアプリの秘密情報を保護するWindowsのデータ保護API。
SQLiteの型マッピング(INTEGER/REAL/TEXT/BLOB)
SQLiteが実際に保存できるINTEGER/REAL/TEXT/BLOBの4つの型に、.NETの型を割り当てるMicrosoft.Data.Sqliteの対応規則。
金額を最小通貨単位の整数で持つ設計
金額をdecimalではなく、円などの最小通貨単位に換算したINTEGER(long)で保存する設計方針。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。