最近圍繞著c++和C#的討論越來越激烈,firelong努力著證明自己的觀點,園子里一些大大們也在激烈的辯證著,作為小鳥的我,旁觀,看看一笑而過吧。
其實無論哪種語言,肯定有它的優(yōu)勢和劣勢,我們何必去爭個你死我活呢?我承認firelong有些觀點正確,但這些會影響我們嗎?我相信有一定基礎(chǔ)的程序員,都不會去在意,因為我們選擇的不僅僅是語言,或許還有更多,如果單單靠某些人的一些觀點,我們就改變了,那也太沒立場了,變成墻頭草了不是?
但我很喜歡看這種討論,因為firelong把自己的觀點,例子舉了出來,而不是理論上的進行駁斥,這種文章看出來是作者用心實踐過的,我們應(yīng)該支持,對于那種沒有實踐,只是一再的崇拜或者詆毀的人,出來就是辱罵的,大家一起來鄙視下吧。
今天不是為了參與討論,正好今天遇到了個問題(其實一直懶得解決),符合了標題,隨便說說,說的難聽了,大家見諒,笑笑而過吧。
問題其實很簡單,更新靜態(tài)變量的值,而這個值呢,又是從linq to sql中獲取的,大概的結(jié)構(gòu)如下:
public class MyConfig { private static DataLoader s_loader; static MyConfig() { s_loader = new DataLoader (); } public static List < Company > AllCompanies { get { return s_loader.GetAllCompanies(); } } public static List < MyType > AllTypes { get { return s_loader.GetAllTypes(); } } }
?
簡單的一個獲取配置信息的一個類(這是舉例用的,實際使用中并不是這樣)。
DataLoader 是與數(shù)據(jù)庫相關(guān)的一個操作類,主要是通過linq to sql 來獲取數(shù)據(jù)庫中的信息。
代碼:
public class DataLoader { public DataLoader() { } DataClasses1DataContext context = new DataClasses1DataContext (); internal List < MyType > GetAllTypes() { return context.MyType.ToList(); } internal List < Company > GetAllCompanies() { return context.Company.ToList(); } }
代碼丑了點,見諒見諒,主要的目的只有2個,獲取所有類型和獲取所有公司。
實際運用在了web項目中,又有另外一個后臺專門來修改數(shù)據(jù),這時候就出現(xiàn)了一個問題,默認情況下,linq to sql 會從緩存中獲取數(shù)據(jù)。
操作步驟如下:循環(huán)讀取MyType-》無論利用什么方法,修改數(shù)據(jù)庫的MyType值-》再次讀取。
因為用了命令行項目來實驗的,那必須修改前和修改后都不能關(guān)閉命令行程序。以下簡單的測試代碼:
static void Main( string [] args) { var key = String .Empty; while (key != "quit" ) { key = Console .ReadLine(); MyConfig .AllTypes.ForEach(c => Console .WriteLine(c.Title)); MyConfig .AllCompanies.ForEach(c => Console .WriteLine(c.Name)); } Console .WriteLine( "program to quit..." ); //Console.ReadLine(); }
測試很簡單,只要不輸入quit,每次都會輸出類型標題和公司名稱。看下前后結(jié)果:
(利用Sql Manager Studio修改數(shù)據(jù))
?
看到了,這就是linq to sql 的緩存造成的結(jié)果,為了避免這個情況,我們可以使用以下方法:
1、把DataContext.ObjectTrackingEnabled屬性設(shè)置為false
???? 因為linq to sql獲取數(shù)據(jù)緩存的時候,先檢索標識是否改變,如果未改變,則會用緩存中的數(shù)據(jù)。而ObjectTrackingEnabled設(shè)為false后,會關(guān)閉標識管理和變化跟蹤,那樣每次獲取都會是最新的數(shù)據(jù)。(以下是重新測試結(jié)果,測試前數(shù)據(jù)恢復(fù))
目的是達到了,我們知道關(guān)閉ObjectTrackingEnabled屬性,是一個好的提升性能的方式,但有時候也會造成一定的麻煩,比如更新、比如我要獲取一對多,多對多的對象時。(其實是自己一開始沒注意到,等改了以后發(fā)現(xiàn)項目中。。。。已經(jīng)慘不忍睹了,綠一下自己)。
2、DataContext.Refresh方法。
????? 使用指定方法刷新實體對象(摘自msdn)。使用它以后,我能更新自己,而不影響其他人了。Refresh的方法,大家可以看msdn,我就寫下代碼吧,代碼只修改了獲取類型的方法。
internal List < MyType > GetAllTypes() { var types = context.MyType.ToList(); context.Refresh( RefreshMode .KeepChanges, types); return types; }
我們再測試下(數(shù)據(jù)恢復(fù)先,直接上結(jié)果了):
實驗成功,獲取到了最新的MyType值,而公司的值則是修改前的,當(dāng)然在程序下次運行的時候,就會變成最新的了。
3、重新實例化DataContext。(不說了)
?
以上東東純屬亂寫,只是自己遇到的一個問題,可能寫的不好,大家也不要拼命砸磚哦。
?
再說說最近的激辯吧,大家也不要辯論什么了,只要做好自己,努力提高自己就好,我們在實際應(yīng)用中,會遇到許許多多的項目,每個項目的開始,都會商量好用什么語言來寫,什么框架來建,不要為了哪個語言好哪個語言不好去爭個不休,每個項目都會有不同的需求,用最適合的而不是用最好的,那就行了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
