#1.事の背景
Accessを使ってデータを加工する処理をVB.NETで書いていますが、.net3.5で動かしていたプログラムの
動作が重いと感じ、.net4.5でコンパイルしなおしたところ、手で動かしても落ちないところで、落ちるようになった。
#2.考えたこと
##①DBの最適化を細かく差し込んだ
正直パフォーマンスは低下したが、ほぼリコンパイルしても動くようになったが、最適化をかけまくるとプロセスに
大量のAccessプロセスが残るる場合があり、そうなると落ちてしまう。
ただ、大量にDelete処理を入れた時は、最適化をかけないと次の処理で落ちてしまうので、そこには最適化が必要。
##②クエリの間に微小なWaitを入れる
.netからの応答にAccessが耐えられない状況が出てくる模様で、数ミリ秒のWaitを入れてあげることで、
改善
#3.Waitのコード例
Public Sub AccessCompaction(ByVal dbPath As String, ByVal dbName As String)
'最適化元のMDBファイル名
Dim strWorkingAccess As String
'最適化先のMDBファイル名
Dim strTempDb As String
' 必要な変数を宣言する
Dim dtNow As DateTime = DateTime.Now
' 指定した書式で日付を文字列に変換する
Dim stPrompt1 As String = dtNow.ToString("yyyyMMddHHmmss")
Dim dbe As Dao._DBEngine = Nothing
'最適化元のMDBファイルのフルパスを設定
strWorkingAccess = dbPath & dbName
'最適化先の一時MDBファイルのフルパスを設定
strTempDb = dbPath & "~tmp" & stPrompt1 & dbName
Log4Logs.Info("Access最適化:元DB:" & strWorkingAccess)
Log4Logs.Info("Access最適化TempDB:" & strTempDb)
Try
'修復の実行
'_mAccessApp.DBEngine.RepairDatabase(strWorkingAccess)
'最適化の実行
_mAccessApp = New Access.Application()
_mAccessApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityLow 'マクロを有効にして開くように設定
_mAccessApp.DBEngine.CompactDatabase(strWorkingAccess, strTempDb)
System.Threading.Thread.Sleep(500)
'最適化元のファイルを削除
Kill(strWorkingAccess)
System.Threading.Thread.Sleep(500)
'最適化先のファイル名を最適化元のファイル名にリネーム
File.Move(strTempDb, strWorkingAccess)
Log4Logs.Info("Access最適化完了")
Catch ex As Exception
Console.WriteLine((ex.GetType().FullName & vbCrLf & ex.Message.ToString), MsgBoxStyle.Exclamation)
Finally
Log4Logs.Info("一時停止")
System.Threading.Thread.Sleep(60000)
Console.WriteLine("最適化完了")
End Try
End Sub