tft每日頭條

 > 生活

 > static如何用

static如何用

生活 更新时间:2024-07-24 17:28:00

static如何用?為了壓系統,昨天小組在測試環境模拟了一大批訂單數據今天上午查看記錄的賬單計息日志,發現了一大堆的MySqlException,今天小編就來聊一聊關于static如何用?接下來我們就一起去研究一下吧!

static如何用(static你還敢用嗎)1

static如何用

為了壓系統,昨天小組在測試環境模拟了一大批訂單數據。今天上午查看記錄的賬單計息日志,發現了一大堆的MySqlException

MySql.Data.MySqlClient.MySqlException (0x80004005):

諸如:

2017-01-05 00:40:49.891賬單計息異常/{"BillId":1000012082,"OrderId":"DD201701040002672"}:MySql.Data.MySqlClient.MySqlException (0x80004005): There is already an open DataReader associated with this Connection which must be closed first.

通過分析程序,發現dal層的所有方法都是靜态的,其中還包括一個靜态的db連接對象:

public class BillsDal{ static IDbConnection _conn = ConnUtility.GateWayConntion; /// <summary>

突然想到之前整理的blog《static,你還敢用嗎?》,所以,不難分析出來原因:問題就出在這個靜态的db連接對象_conn上,因為所有類的實例始終是用一個db連接,當并發出現時,又沒有lock數據操作代碼,那麼,就很容易出現連接在未關閉時又要被建立并打開,這樣就出現了db連接異常。

經模拟多線程來測試,的确如此。

問題即答案!修複這個bug的話,有如下2個方案:

  1. 如果仍然要保留這個static的_conn字段,就要用lock來鎖住數據操作代碼(GetOrdersBillList),以控制并發沖突

  2. 每次查詢時用一個新的連接對象。

方案分析:第1種,涉及到對象隻能在被釋放(關閉)掉才能再次被使用(打開),性能低下,不可取。 第2種呢,其實在dal層,絕大多數的程序猿都是按照每一個數據操作隻用一個db連接的方式來編碼的。 由于大家一般不會把dal類的成員定義成static,所以,也就不會遇到這樣的db連接異常。而我呢,傾向于用static方法,考慮到封裝,就把這個db連接對象封裝成靜态字段了,反而忽視了靜态數據成員帶來的隐患——數據量小時幾乎是暴露不出來問題,一旦數據量大起來,有了并發,就會出現資源被同時使用,這樣的話,多個線程實例都要修改其狀态時,就出現了并發異常。

由此來看,依然用static的話,就要把_conn當做隻讀的私有屬性(不考慮代碼味道):

static IDbConnection _conn

這樣,當每次訪問這個屬性時,都會返回一個新的連接對象。

再次模拟多線程測試,ok!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved