発生している問題
C#でSQLiteデータベースを使用しています。
タイマーを使用して一定間隔毎にデータベースの読み取りを行おうとしているのですが、データベースへのアクセスをするたびにメモリ(プライベートワーキングセット)が増加しておりメモリリークしてしまいます。
下記のような簡単なサンプルを作ったところSQLiteConnectionStringBuilderがガベージコレクションに全く回収されないようです。
タイマーで一定周期でDBを読み取るような場合にSQLiteConnectionStringBuilderをガベージコレクションに回収させるようなことはできないのでしょうか?
できない場合、どのように実装するのがベストプラクティスなのか教えていただけないでしょうか?
該当のソースコード
C#
1static void Main(string[] args) 2{ 3 Timer timer = new Timer(10000); 4 timer.Elapsed += (sender, e) => 5 { 6 SQLiteConnectionStringBuilder dbConnectionString = new SQLiteConnectionStringBuilder 7 { 8 SyncMode = SynchronizationModes.Off, 9 JournalMode = SQLiteJournalModeEnum.Memory, 10 DefaultTimeout = 60, 11 BusyTimeout = 10, 12 ReadOnly = true 13 }; 14 15 string test = null; 16 using (SQLiteConnection dbConnection = new SQLiteConnection(dbConnectionString.ToString())) 17 { 18 dbConnection.Open(); 19 using (DataContext dbContext = new DataContext(dbConnection)) 20 { 21 dbContext.ObjectTrackingEnabled = false; 22 /* ここでLINQでSQLを構築しデータアクセス */ 23 var items = from test in dbContext.GetTable<TestTable>() 24 where test.Id == 1 25 select test; 26 foreach (var item in items) 27 { 28 test = String.Copy(item.TestName); 29 break; 30 } 31 } 32 } 33 dbConnectionString = null; 34 }; 35 timer.Start(); 36 Console.ReadKey(); 37} 38 39[Table(Name = "T_TEST")] 40public class TestTable 41{ 42 [Column(Name = "ID", DbType = "BIGINT", CanBeNull = false, IsPrimaryKey = true)] 43 public Int64 Id { get; set; } 44 45 [Column(Name = "TestName", DbType = "NVARCHAR", CanBeNull = false)] 46 public string TestName { get; set; } 47 48 public TestTable() 49 { 50 this.Id = -1; 51 this.TestName = ""; 52 } 53} 54 55
環境:VisualStudio 2013 .Net Framework 4.5
1時間あたり何MB増えて、計測は何時間しましたか?

回答3件
あなたの回答
tips
プレビュー