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

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