https://ithelp.ithome.com.tw/questions/10214167
這是我之前問的問題最後面我遇到的問題大概解了,我是加了LOCK
並把裡面的值加到LIST裡並判斷有沒有值
ConcurrentStack<資料庫連線相關> sBachSQL = new ConcurrentStack<資料庫連線相關>();
string data = string.Empty;
List<string> previousDataList = new List<string>();
try{
Count = 0;
SqlString = "";
string[] lines = File.ReadAllLines(Path);
if (lines != null && lines.Count() > 0)
{
Parallel.ForEach(lines, (item, loopState) =>
{
lock (_lock)
{
if (!previousDataList.Contains(item.ToString()))
{
data = item.ToString();
previousDataList.Add(data);
}
try
{
//解析並回傳更新的SQL語法
SqlString = RerurnSqlString(data);
}
catch (Exception exc)
{
}
if (SqlString.Trim() != "")
{
sBachSQL.Add(SqlString);
Count++;
}
//每1000筆執行一次交易
if ((Count == 1000))
{
ExecuteTransaction(SqlString);
Count = 0;
SqlString = "";
sBachSQL = new ConcurrentBag<資料庫連接相關CLASS>();
}
}
});
}
if ((Count !=0))
{
ExecuteTransaction(SqlString);
Count = 0;
SqlString = "";
sBachSQL = new ConcurrentBag<資料庫連接相關CLASS>();
}
}
目前確定lines裡讀取的相關資料都有做到更新
可是因為加了LOCK的關係,整體效能基本上跟沒使用並行差不多
不用LOCK的話則只使用了一半的時間,但不是每一筆資料皆有更新
想請問這部分我能怎麼調整呢?
上次提問有人建議我可以使用SqlBulkCopy,但看他好像不能做更新QQ
Oracle 有 external table, Oracle 的多年的載入外部資料工具 SQL*Loader
將資料載入後,建立一個暫存或是日期流水命名的 table ,再做處理,這時候有 upsert
https://docs.oracle.com/en/database/other-databases/nosql-database/21.1/sqlfornosql/adding-table-rows-using-insert-and-upsert-statements.html#GUID-2C68AD4C-B804-4562-8C6B-AD05AE21AB6C
就可以很方便快速的根據上面建立的table,來去異動其他table.
--
用程式迴圈一筆筆讀,然後再一道道SQL 去異動, 這個好處是程式會變的很多隻,
也都跑很慢,增加地球的二氧化碳.但是這是很多人這樣做啦,而且還認為這是唯一的方法.
原本我是不太想寫上面那些啦.一來容易得罪人,二來你若是這樣做,可能會破壞你們
皇城裡的和諧,反而對你不好.