2011-08-26 103 views
0

我在監視Jpg文件的文件夾並需要處理傳入的文件。 我解碼文件名以獲取我想要的所有信息並將其插入表中,然後將該文件移動到另一個文件夾。快速插入記錄

文件名已包含我想要的所有信息。例如。

2011--8-27_13:20:45_MyLocation_User1.jpg. 

現在我使用的是Insert聲明

Private Function InsertToDB(ByVal SourceFile As String, ByVal Date_Time As DateTime, ByVal Loc As String, ByVal User As String) As Boolean 

    Dim conn As SqlConnection = New SqlConnection(My.Settings.ConString) 
    Dim sSQL As String = "INSERT INTO StageTbl ...." 
    Dim cmd As SqlComman 
    cmd = New SqlCommand(sSQL, conn) 

    ....Parameters Set ... 

     conn.Open() 
     cmd.ExecuteNonQuery() 
     conn.Close() 
     conn = Nothing 
     cmd = Nothing 
    End Function 

功能將被要求找到每一個文件。

這是最有效的方法嗎?看起來很慢。我需要處理大約20〜50個文件/秒。可能是一個存儲過程?

我需要儘快做到這一點。我猜這裏批量插入不適用。

請幫忙。

回答

1

批量插入可能適用於此處 - 您是否需要它們立即在數據庫中,或者您是否可以在內存中構建記錄,然後將它們批量推入數據庫?

你是否是多線程的 - 否則你的端到端流程可能會落後。

另一種解決方案是使用消息隊列 - 爲每個文件彈出消息到隊列中,然後在不斷讀取隊列並添加到數據庫中的進程(在不同的線程上)。

1

有幾件事情可以做,以優化這一過程的速度:

  • 不要打開和關閉每一個插入的連接。僅此一項就會帶來(非常)顯着的性能提升(除非您已經使用連接池)。
  • 如果您禁用自動提交併以塊爲單位執行插入,則在每N行(100-1000行是一個很好的數字以嘗試啓動)之後提交事務,您可能會獲得性能。
  • 某些DB系統提供了一種語法,允許在單個查詢中插入多行。 SQL Server不會但您可能對此感興趣:http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/
  • 如果有許多用戶/進程訪問此表,訪問可能會很慢,具體取決於您的事務隔離級別。在你的情況下(20-50插入/秒),這不應該有很大的區別。我不建議修改這個,除非你很好地理解你在做什麼:http://en.wikipedia.org/wiki/Isolation_%28database_systems%29http://technet.microsoft.com/es-es/library/ms173763.aspx
  • 我不認爲存儲過程必然會帶來巨大的性能提升。你只是每秒鐘解析/計劃插入20-50次。僅當它適合您的開發模型時才使用存儲過程。如果所有其他查詢都在代碼中,則可以避免它。
  • 確保您的瓶頸是數據庫(即移動文件不需要很多時間),但由於操作系統應該擅長這一點,請檢查上面的要點。如果您發現移動文件是瓶頸,則在一定程度上延遲或移動後臺文件(另一個線程)可能會有所幫助。