知識マップ: 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として保存され比較が文字列規則になるため、金額は最小通貨単位の整数で持つのが安全である。
flowchart LR
accTitle: C#でSQLiteを運用する知識マップ
accDescr: Microsoft.Data.SqliteでSQLiteを業務アプリに組み込む際に、WALモードがSQLITE_BUSYを減らすこと、書き込み経路の一本化とトランザクションのまとめ方、バックアップと破損対策の正しい手段、decimal型のTEXT保存が引き起こす罠、EF Coreとの使い分けの関係を示す図
microsoft_data_sqlite["Microsoft.Data.Sqlite"]
wal_mode["WALモード(Write-Ahead Logging)"]
system_data_sqlite["System.Data.SQLite"]
ef_core_sqlite_provider["Microsoft.EntityFrameworkCore.Sqlite"]
new_sqlite_development["新規開発でのSQLiteライブラリ採用"]
sqlite_busy["SQLITE_BUSY(database is locked)"]
sqlite_write_serialization["書き込み経路の一本化(Channelsによる書き込みキュー)"]
sqlite_transaction_batching["明示的トランザクションによるINSERTのバッチ化"]
sqlite_commit_fsync_overhead["コミットごとの同期書き込み(fsync)コスト"]
sqlite_file_copy_backup["稼働中DBファイルの単純ファイルコピー"]
sqlcipher["SQLCipher"]
dpapi["DPAPI"]
sqlite_connection_pooling["Microsoft.Data.Sqliteの接続プーリング"]
sqlite_file_handle_retention["プーリングによるDBファイルハンドルの保持"]
sqlite_clearpool["SqliteConnection.ClearPool"]
sqlite_corruption["SQLiteデータベースの破損"]
vacuum_into["VACUUM INTO"]
sqlite_backup_requirement["稼働中SQLiteデータベースの一貫したバックアップ要件"]
sqlite_backupdatabase["SqliteConnection.BackupDatabase"]
backupdatabase_write_blocking["BackupDatabase完了までの書き込みブロック"]
sqlite_quick_check["PRAGMA quick_check"]
sqlite_encryption_requirement["SQLiteデータベース全体の暗号化要件"]
app_secrets["アプリの秘密情報"]
sqlite_type_mapping["SQLiteの型マッピング(INTEGER/REAL/TEXT/BLOB)"]
decimal_text_sort_bug["decimal列のTEXT保存による比較・集計の不整合"]
money_as_integer["金額を最小通貨単位の整数で持つ設計"]
microsoft_data_sqlite -.->|"両立しない"| system_data_sqlite
ef_core_sqlite_provider -->|"利用する"| microsoft_data_sqlite
microsoft_data_sqlite -->|"推奨される対応"| new_sqlite_development
system_data_sqlite -.->|"用いるのは非推奨"| new_sqlite_development
wal_mode -->|"軽減する"| sqlite_busy
microsoft_data_sqlite -->|"軽減する"| sqlite_busy
sqlite_write_serialization -->|"軽減する"| sqlite_busy
sqlite_transaction_batching -->|"軽減する"| sqlite_commit_fsync_overhead
sqlite_write_serialization -->|"利用する"| sqlite_transaction_batching
wal_mode -->|"両立しない"| sqlite_file_copy_backup
sqlcipher -.->|"前提とする"| dpapi
microsoft_data_sqlite -.->|"利用する"| sqlite_connection_pooling
sqlite_connection_pooling -->|"原因になり得る"| sqlite_file_handle_retention
sqlite_clearpool -->|"防止する"| sqlite_file_handle_retention
sqlite_file_copy_backup -->|"原因になり得る"| sqlite_corruption
vacuum_into -->|"推奨される対応"| sqlite_backup_requirement
sqlite_backupdatabase -->|"推奨される対応"| sqlite_backup_requirement
sqlite_file_copy_backup -->|"用いるのは非推奨"| sqlite_backup_requirement
sqlite_backupdatabase -->|"原因になり得る"| backupdatabase_write_blocking
sqlite_corruption -->|"で確認できる"| sqlite_quick_check
sqlcipher -->|"推奨される対応"| sqlite_encryption_requirement
microsoft_data_sqlite -->|"用いるのは非推奨"| sqlite_encryption_requirement
dpapi -->|"推奨される対応"| app_secrets
sqlite_type_mapping -.->|"原因になり得る"| decimal_text_sort_bug
money_as_integer -->|"防止する"| decimal_text_sort_bug
ef_core_sqlite_provider -.->|"利用する"| wal_mode
ef_core_sqlite_provider -.->|"原因になり得る"| decimal_text_sort_bug
概念間の関係(全27件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Microsoft.Data.SqliteはSystem.Data.SQLiteと両立しません。
- Microsoft.EntityFrameworkCore.SqliteはMicrosoft.Data.Sqliteを利用します。
- Microsoft.Data.Sqliteは新規開発でのSQLiteライブラリ採用に対する本記事の推奨です。
- System.Data.SQLiteを新規開発でのSQLiteライブラリ採用に用いることは推奨されません。
- WALモード(Write-Ahead Logging)はSQLITE_BUSY(database is locked)を軽減します。
- Microsoft.Data.SqliteはSQLITE_BUSY(database is locked)を軽減します。
- 書き込み経路の一本化(Channelsによる書き込みキュー)はSQLITE_BUSY(database is locked)を軽減します。
- 明示的トランザクションによるINSERTのバッチ化はコミットごとの同期書き込み(fsync)コストを軽減します。
- 書き込み経路の一本化(Channelsによる書き込みキュー)は明示的トランザクションによるINSERTのバッチ化を利用します。
- WALモード(Write-Ahead Logging)は稼働中DBファイルの単純ファイルコピーと両立しません。
- SQLCipherはDPAPIを前提とします。
- Microsoft.Data.SqliteはMicrosoft.Data.Sqliteの接続プーリングを利用します。
- Microsoft.Data.Sqliteの接続プーリングはプーリングによるDBファイルハンドルの保持の原因になることがあります。
- SqliteConnection.ClearPoolはプーリングによるDBファイルハンドルの保持を防ぎます。
- 稼働中DBファイルの単純ファイルコピーはSQLiteデータベースの破損の原因になることがあります。
- VACUUM INTOは稼働中SQLiteデータベースの一貫したバックアップ要件に対する本記事の推奨です。
- SqliteConnection.BackupDatabaseは稼働中SQLiteデータベースの一貫したバックアップ要件に対する本記事の推奨です。
- 稼働中DBファイルの単純ファイルコピーを稼働中SQLiteデータベースの一貫したバックアップ要件に用いることは推奨されません。
- SqliteConnection.BackupDatabaseはBackupDatabase完了までの書き込みブロックの原因になることがあります。
- SQLiteデータベースの破損はPRAGMA quick_checkで確認できます。
- SQLCipherはSQLiteデータベース全体の暗号化要件に対する本記事の推奨です。
- Microsoft.Data.SqliteをSQLiteデータベース全体の暗号化要件に用いることは推奨されません。
- DPAPIはアプリの秘密情報に対する本記事の推奨です。
- SQLiteの型マッピング(INTEGER/REAL/TEXT/BLOB)はdecimal列のTEXT保存による比較・集計の不整合の原因になることがあります。
- 金額を最小通貨単位の整数で持つ設計はdecimal列のTEXT保存による比較・集計の不整合を防ぎます。
- Microsoft.EntityFrameworkCore.SqliteはWALモード(Write-Ahead Logging)を利用します。
- Microsoft.EntityFrameworkCore.Sqliteはdecimal列のTEXT保存による比較・集計の不整合の原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。