做了一個批量上傳檔案到資料庫的小程式。
功能已經OK,但是發現時間比較長,除錯了一下,發現在清理Parameters.Clear()時,每次用時都要5秒左右
找了點資料,沒有發現有什么好的處理方法,特來請教一下大蝦們。
謝謝啦1
conn.Open();
cmd.Transaction = conn.BeginTransaction();//開啟事務
for (int i = 0; i < rowSql.Count; i++)
{
cmd.Parameters.Clear();
cmd.CommandText = rowSql[i];
cmd.Parameters.AddRange(parms[i]);
cmd.ExecuteNonQuery();
}
cmd.Transaction.Commit();//提交事務
return true;
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
為什么要Clear呢?你不是每次都新的實體化嗎
uj5u.com熱心網友回復:
大佬,請教一下,他這樣寫會不會造成連接占用過多的情況?是不是應該只創建一次持久化連接多次提交就行了。
uj5u.com熱心網友回復:
不會的,而且就應該一個請求創建一次連接。
底層有連接池幫你管理鏈接,你無需關心連接占用過多的情況。
而所有的單例型別的資料庫鏈接模式。基本都是扯淡的。。。。
uj5u.com熱心網友回復:
為什么要Clear呢?
你不是每次都新的實體化嗎
大佬,請教一下,他這樣寫會不會造成連接占用過多的情況?是不是應該只創建一次持久化連接多次提交就行了。
不會的,而且就應該一個請求創建一次連接。
底層有連接池幫你管理鏈接,你無需關心連接占用過多的情況。
而所有的單例型別的資料庫鏈接模式。基本都是扯淡的。。。。
思路是這樣的,做一個自動更新的小程式,遍歷目錄中的所有檔案,并將檔案存盤到資料庫中。
1.foreach( ) 將所有的檔案二進制,并存盤到一個集合中List<SqlParameter[]>
2.通過事務執行。(如果不做CLEAR清除的話,會報錯)
但是clear()的時間一條就需要5秒。
我判斷是因為將檔案轉成二進制存盤后,清除時會時間比較長。
因為我在查詢這個表的時候,只有190條資料,卻花了15秒。。。。

uj5u.com熱心網友回復:
為什么要Clear呢?
你不是每次都新的實體化嗎
大佬,請教一下,他這樣寫會不會造成連接占用過多的情況?是不是應該只創建一次持久化連接多次提交就行了。
不會的,而且就應該一個請求創建一次連接。
底層有連接池幫你管理鏈接,你無需關心連接占用過多的情況。
而所有的單例型別的資料庫鏈接模式。基本都是扯淡的。。。。
思路是這樣的,做一個自動更新的小程式,遍歷目錄中的所有檔案,并將檔案存盤到資料庫中。
1.foreach( ) 將所有的檔案二進制,并存盤到一個集合中List<SqlParameter[]>
2.通過事務執行。(如果不做CLEAR清除的話,會報錯)
但是clear()的時間一條就需要5秒。
我判斷是因為將檔案轉成二進制存儲后,清除時會時間比較長。
因為我在查詢這個表的時候,只有190條資料,卻花了15秒。。。。
因為你存盤的二進制都不小。
所以慢
uj5u.com熱心網友回復:
為什么要Clear呢?
你不是每次都新的實體化嗎
大佬,請教一下,他這樣寫會不會造成連接占用過多的情況?是不是應該只創建一次持久化連接多次提交就行了。
不會的,而且就應該一個請求創建一次連接。
底層有連接池幫你管理鏈接,你無需關心連接占用過多的情況。
而所有的單例型別的資料庫鏈接模式。基本都是扯淡的。。。。
思路是這樣的,做一個自動更新的小程式,遍歷目錄中的所有檔案,并將檔案存盤到資料庫中。
1.foreach( ) 將所有的檔案二進制,并存盤到一個集合中List<SqlParameter[]>
2.通過事務執行。(如果不做CLEAR清除的話,會報錯)
但是clear()的時間一條就需要5秒。
我判斷是因為將檔案轉成二進制存盤后,清除時會時間比較長。
因為我在查詢這個表的時候,只有190條資料,卻花了15秒。。。。
因為你存盤的二進制都不小。
所以慢
其實程式檔案都不是很大,大的才5M左右
而且在資料庫查詢的時候也很慢
有沒有辦法解決?
uj5u.com熱心網友回復:
沒什么太好的辦法。除非只存盤路徑。
uj5u.com熱心網友回復:
你把檔案轉二進制存盤肯定慢啊, 資料庫也會很大, 你可以放FOR里試試。 這樣就不用clear了 。看看會不會剩點時間. 最后你好像少了個Transaction.Rollback();conn.Open();
for (int i = 0; i < rowSql.Count; i++)
{
SqlCommand cmd=new SqlCommand ();
cmd.Transaction = conn.BeginTransaction();//開啟事務
cmd.CommandText = rowSql[i];
cmd.Parameters.AddRange(parms[i]);
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();//提交事務
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/16235.html
標籤:C#
上一篇:這種情況怎么弄那
下一篇:vb.net的CS專案打包問題
