LG 伸縮螢幕手機最新渲染圖現身韓國論壇_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

近期最熱門的的手機技術,摺疊機也算是重點之一,對於如何擴展手機螢幕這件事情,顯然 LG 有不同的想法,雖說之前就有許多傳言說是捲動螢幕等各種機制,近日在韓國的論壇上出現了最新渲染圖,而且資訊也越來越多,似乎接下來我們可以從上下、左右摺疊之外,看到另外一種擴展螢幕的新方式。

LG 伸縮螢幕手機最新渲染圖現身韓國論壇

據傳 LG 將在 3 月左右推出首款搭載伸縮螢幕的智慧型手機,而這項設備在 LG Wing 發表時,LG 就已經簡明帶過了伸縮螢幕手機目前正在開發中的說法,在 LG 的內部文件(下圖)中也可見這款手機的存在。關於 LG伸縮螢幕的細節似乎越來越多,近日在韓國的論壇 Meeco(미코) 上出現了兩張關於伸縮螢幕手機的渲染圖,但貼文作者 Stellist 並沒有明確表明這些圖片來源是官方還是概念圖。

在這次的最新渲染中,清楚地標註部分規格,包含螢幕大小與顯示解析度等細節。在收合狀態下,螢幕尺寸為 6.8 吋,解析度為 1080 x 2428;完全展開後的螢幕尺寸將達 7.4 吋,解析度 1600 x 2428,螢幕長寬比為 3:2。雖說還無法確定該資訊是否正確,但上述的規格並非不能想像,像是 OPPO 在去年 11 月展示過的伸縮螢幕手機正是 6.7 吋伸展到 7.4 吋的大小。

從設計上來看非常近似於 OPPO 的設計,與 2019 年底 LetsGoDigital 報導過的 LG 伸縮螢幕手機也很類似。一年一度的 CES 即將展開,雖說今年採線上方式舉辦,但很有可能 LG 會在這次的展會中秀出伸縮螢幕手機的真實樣貌。畢竟是新的技術,可以預期屆時上市後的價格方面將不會太親切,但 LG 也很可能會選擇與 Wing 同樣的策略,配備非旗艦的處理器來壓低成本與抑制價格。

◎資料來源:Meeco、 LetsGoDigital 

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

 

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

15萬隻要合資SUV?很多人都漏看了這幾款有檔次有個性的SUV_租車

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

98-18。88萬廣汽菲克Jeep 自由

對於時下的年輕人來說,那些SUV車型是他們最關注的?作為接受流行文化的先驅,

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

時下的年輕人都追求特立獨行,因此一些個性出眾的SUV就是他們所追求的,時下一些出色的合資品牌為了這些年輕人也推出了不少品質出眾的個性SUV。

北京現代 ix25

售價:11.98-18.88萬

雙龍汽車 蒂維拉

售價:12.98-18.98萬

雷諾 卡繽

售價:13.98-18.88萬

廣汽菲克Jeep 自由本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

紐西蘭推動「國內木材優先」政策 將創造逾3000個工作機會_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

摘錄自2020年5月7日大紀元報導

來自紐西蘭全國各地的商會和林業領袖呼籲政府採取「國內木材優先(wood-first )」的政策。該政策意味著,在新冠病毒(covid-19)之後,國產和加工木材將成為公共資助的住宅、商業和公共建築的首選建築材料。預計該政策可以在全國範圍內創造數千個就業機會,並減少紐西蘭林業對國際出口的依賴。

羅托魯瓦湖理事會(Rotorua Lakes Council)五年前通過了這一決策,它是第一個通過該政策的理事會。現在,羅托魯瓦(Rotorua)、陶朗加(Tauranga)、富東灣(Eastern Bay of Plenty)、奧克蘭和其他幾個商會呼籲中央政府也通過這一決策。Deloitte的研究顯示,建築用木材產品增加25%,將為全國各地的木材加工、林業和運輸行業以及港口創造逾3000個就業崗位,以及間接的支持性就業崗位。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

 

生活環境
建築
環境經濟
農林漁牧業
循環經濟
土地利用
國際新聞
紐西蘭
林業
國產材

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

好尷尬!Samsung 官方被發現用 iPhone 發推特來宣傳 Unpacked 發表會活動_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

用別牌的手機來貼文推廣另一個品牌活動,這種低級失誤雖然不是第一次發生,但之前大多都是代言人居多,沒想到已經有這麼多先例之後,最近即將舉辦 Unpacked 發表會的 Smasung,稍早美國官方 Twitter 小編又不小心犯了這個錯誤,使用 iPhone 來預告 Unpacked 發表會的內容,雖然推文很快被刪除,但已經有人把圖給擷取下來。

Samsung 官方被發現用 iPhone 發推特來宣傳 Unpacked 發表會活動

Samsung 今年重要的 Unpacked 發表會即將於今日稍晚時間登場,預計會推出 Galaxy S21 系列,也因此各國的官方 Twitter、FaceBook 粉絲團都開始醞釀,稍早 Samsung Mobile US 官方 Twitter 刊登一則「隨著 #SamsungUnpacked 越來越近,我們正努力為您帶來令人振奮的消息,您希望看到哪些創新與進步呢?」貼文時,右下角使用的裝置寫著 iPhone,不是自家 Samsung,這畫面很快就引起熱烈討論,也被人快速截圖下來:

雖然這無關大雅,但畢竟是 Samsung 官方推特帳號,推文內容又是今年重點新機的發表會,還是讓人覺得不太應該,只能說小編可能當時真的累了!不過從另一面來說,也為 Samsung 這場發表會製造出不小的話題。

這其實也不是 Samsung 第一次傳出這類新聞,不過之前都是代言人,像 2013 年網球明星 David Ferrer 就曾用 iPhone 貼文 Galaxy S4 的內容,另外還有前 T-Mobile 執行長 John Legere 用 iPhone 說他很喜歡 Note 3:

Samsung 也曾在 2 年前,起訴俄羅斯品牌大使 Ksenia Sobchak 在某次電視採訪中被發現使用 iPhone X,而不是 Samsung 手機:

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

所以說,管理手機品牌的小編,在發推文時真的要多加注意,不確定美國這位 Samsung Mobile US 小編會不會受到相關懲處。

資料來源:Apple Insider

多位 Samsung Galaxy S20 FE 國外用戶反應螢幕有問題,出現奇怪現象,連外媒都碰到

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

小米米家螢幕掛燈在台推出:亮度色溫可調、螢幕不反光、磁吸旋轉金屬燈體、搭配 2.4GHz 無線遙控器,售價 995 元_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

上個月我們才報導過小米有款相當好用的螢幕神器「米家螢幕掛燈」通過 NCC 認證,今(16)日稍早小米台灣也在官方稍早小米台灣也在官方 Facebook 粉絲專頁預告米家螢幕掛燈將和小米手錶超值版一樣於 1 月 19 日上午 10 點正式在台灣開賣囉!米家螢幕掛燈採用磁吸旋轉的金屬燈體、可調節亮度與色溫、螢幕不反光,且搭配 2.4GHz 的無線遙控器讓操作更容易,價格也是相當親民,只要 995 元。

小米米家螢幕掛燈在台推出:亮度色溫可調、螢幕不反光、磁吸旋轉金屬燈體、搭配 2.4GHz 無線遙控器,售價 995 元

米家螢幕掛燈的安裝方式相當簡單,只需顯示器上方輕輕一掛即可,完全不佔用桌面空間。燈具採用非對稱前向投光設計,並採用定制光學透鏡和光罩,可有效避免螢幕反光、讓用戶觀賞螢幕時不受到眩光困擾。

燈體材質部分,米家螢幕掛燈採用金屬材質機身,燈具部分則採用磁吸結構設計,最大調整角度為 25° 的調整範圍,能依照自身需求調整至最佳的照射角度,有效避免眩光的困擾。轉軸處部分則有 40° 可調重力轉軸,適合 1~32mm 厚度曲面螢幕、平面螢幕和擋板。

顯色指數達到 Ra90 ,可還原色彩真實細節、無可視頻閃,即便長時間使用也不易感到眼睛疲勞。

搭配 2.4GHz 無線遙控器,可透過短按、長按、旋轉等操作,調節包括色溫、亮度、使用模式、電源開關等控制。

供電方面,米家螢幕掛燈採用 USB Type-C 充電接口,能直接連接電腦、螢幕、行動電源貨 USB 充電器進行供電:

米家顯示器掛燈能支援休閒娛樂、工作、閱讀等多場景螢幕照明使用:

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

售價方面,小米米家螢幕掛燈建議售價為新台幣 995 元,將於 1 月 19 日上午 10 點起在台開賣。

圖片/消息來源:小米台灣|小米台灣 Xiaomi Taiwan(Facebook)

延伸閱讀:
小米智慧攝影機雲台版2K 在台開賣:升級 2K 高畫質和 F1.4 大光圈,售價 1,095元

小米摺疊螢幕手機工程機曝光!再次於地鐵車廂被捕獲,只是螢幕摺痕有點顯眼

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

產品將註記碳足跡標籤 Allbirds 的超前部署永續時尚大計_租車

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

轉載自B Lab Taiwan;文:B Lab Taiwan(B型企業協會)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

Sony Mobile 中階新機 Xperia 10 III 高清晰渲染圖曝光:外型與前代相似、仍將保留3.5mm耳機孔_潭子電動車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

去年五月初, Sony Mobile 在台灣推出 Xperia 10 系列中階手機 Xperia 10 II ,在稍早爆料大神 @OnLeaks 也在 Voice 分享了次世代 Xperia 10 系列新機的外觀面貌,若依照過去的命名規則新一代應會命名為 Xperia 10 III 。外觀方面, Xperia 10 III 大致上仍延續過往 Xperia 手機的設計風格,新機仍將保留 3.5mm 耳機插孔。

▲圖片來源:OnLeaks(Voice)

Sony Mobile 中階新機 Xperia 10 III 高清晰渲染圖曝光:外型與前代相似、仍將保留3.5mm耳機孔

稍早 OnLeaks(Steve Hemmerstoffer)在 Voice 分享了首批曝光的 Xperia 10 III(Xperia 10 Mark 3)外觀渲染圖,並透露 Sony Mobile 很可能在接下來幾週內發表這款新機。

根據 OnLeaks 的爆料內容, Xperia 10 III 的機身尺寸約為 154.4*68.4*8.3mm(機身厚度計算後鏡頭高度為 9.1mm),螢幕尺寸將延續前一代採用 6 吋 21:9 比例終極寬螢幕設計,雖然螢幕邊框似乎沒有明顯更窄,也未目前手機市場常見的挖孔螢幕創造更大的螢幕尺碼,但這相對保守的設計仍有許多喜愛它的族群。

▲圖片來源:OnLeaks(Voice)

音效方面,在 Xperia 10 III 預計仍保留雙前置立體聲揚聲器,延續這項設計也是可預期的決定。相機部份, Xperia 10 III 傳聞將配備三鏡頭主相機,分別為 1200 萬像素主鏡頭、800 萬像素望遠鏡頭和 800 萬像素超廣角鏡頭,前相機則搭載 800 萬像素自拍鏡頭,不過關於相機方面規格的升級尚未有更多詳細的資訊。

▲圖片來源:OnLeaks(Voice)

值得慶幸的是 Xperia 10 III 仍將保留 3.5mm 耳機插孔,對於選購中階手機的用戶來說還是相當重要的。

▲圖片來源:OnLeaks(Voice)

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

消息來源:Steve H.McFly(Twitter/@OnLeaks)|OnLeaks(Voice)

延伸閱讀:
ROG Phone 5 真機動圖曝光!機身背面加入 ROG Vision 功能副螢幕,可顯示遊戲、充電、來電通知等訊息

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

“造輪運動”之 ORM框架系列(二)~ 說說我心目中的ORM框架,“造輪運動”之 ORM框架系列(一)~談談我在實際業務中的增刪改查_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

ORM概念解析

   首先梳理一下ORM的概念,ORM的全拼是Object Relation Mapping (對象關係映射),其中Object就是面向對象語言中的對象,本文使用的是c#語言,所以就是.net對象;Relation Mapping則是關係映射,在數據庫的系統中指的就是.net對象與數據庫表之間的關係映射。

  為什麼.net對象與數據庫表之間要進行關係映射呢?

  答案當然是顯而易見的,因為數據庫表的結構與對象的結構非常的相似,如果將兩者之間建立起映射關係,我們就可以很容易地在面向對象語言中像操作普通對象一樣去進行數據庫表的操作,那對程序員來說簡直就是福音。那麼這兩者之間的關係由誰來建立呢,畢竟不能讓它倆憑空去產生關係,當中要有“媒人”撮合,這個“媒人”就叫做ORM框架,也可以叫做數據庫持久層框架。

  在上一篇 “造輪運動”之 ORM框架系列(一)~談談我在實際業務中的增刪改查 中,談了一下我遇到的增刪改查,並分析了原生sql、Lambda to sql、存儲過程等方式的利弊,在這其中我也慢慢地形成了自己對ORM框架的認識,也逐漸繪製出了一幅我心目中完美的ORM框架藍圖。

  描繪藍圖之前先給我的ORM框架取個名字,叫做CoffeeSQL,這個名字的由來是因為我希望自己用了這個框架以後可以給我節省出工作中能享受一杯Coffee的時間~

 

 

1、實體映射

   c#的對象想要與數據庫表建立映射關係,那就要記錄映射關係的配置信息,我更喜歡採用一種一目瞭然的方式來進行配置:直接在類的字段上標識Attribute。

  基本使用方式如下代碼所示:

 1  /// <summary>
 2  /// 實體類
 3  /// </summary>
 4  [Table("T_Students")]
 5  public class Student : EntityBase
 6  {
 7      [PrimaryKey]
 8      [Column]
 9      public string Id { get; set; }
10  
11      [Column("Name")]
12      public string StudentName { get; set; }
13  
14      [Column]
15      public int Age { get; set; }
16  }

  我們可以看到在這個實體類中我們使用了三個Attribute,分別為 TableAttribute(標識映射表)、 PrimaryKeyAttribute(標識主鍵)、CloumnAttribute(標識數據列),相信這些都很好理解。

 

2、lambda操作,增刪改查,強類型

   在一些最基礎的信息增刪改查功能中,對於單表的sql操作是非常頻繁的,我建議使用lambda的形式操作,第一是因為方便,第二是因為單表操作Lambda TO SQL轉化后的sql是最簡便的,所以不用擔心它的性能。

  具體的代碼操作如下:

  1)

1  //Add
2  dbContext.Add<Student>(new Student { Id = newId, StudentName = "王二", Age = 20 });

   2)

1  //delete
2  dbContext.Delete<Student>(s => s.Id.Equals(newId));

   3)

1  //update
2  dbContext.Update<Student>(s => new { s.StudentName }, new Student { StudentName = name })  //更新字段
3           .Where(s => s.Id.Equals(newId))                                                   //where條件
4           .Done();

   4)

1  //select
2  dbContext.Queryable<Student>()
3           .Select(s => new { s.StudentName, s.Id })             //字段查詢
4           .Where(s => s.Age > 10 && s.StudentName.Equals(name)) //where條件
5           .Paging(1, 10)                                        //分頁查詢
6           .ToList();

 

3、原生sql操作,弱類型,非實體類字段的存儲的方式 => 索引器

   上面介紹的lambda表達式的操作方式只適用於單表的查詢,如果需要進行聯多表查詢或者需要進行更複雜的查詢,那麼我更傾向於進行原生sql的查詢。當然,原生sql的查詢也提供結果映射到對象的功能,類似於Dapper的用法。

  具體操作如下:

1  //原生sql查詢用法
2  string complexSQL = "select xxx from t_xxx A,t_yyy B where xx = {0} and yy = {1}";
3  object[] sqlParams = new Object[2] { DateTime.Now, 2 };
4  var resList = dbContext.Queryable(complexSQL, sqlParams).ToList<Student>();

   對上面的代碼稍微進行一下解釋,complexSQL 中的 {0}{1} 是參數化查詢參數的佔位符,在原生sql的查詢用法中你可以使用任意c#的基本變量去填充佔位符,最終獲得sql參數化查詢的效果,用法非常方便。

  當然你可能會困惑:假如我查詢的結果中包含了不是Student對象中字段的值怎麼辦?

  答案是,你可以用索引的方式將非Student對象中字段的值取出,下面做一個示範,假如你希望查出 xxx 字段,你可以這樣做:

1  Student resList1 = resList[0];
2  var segmentValue = (string)resList1["xxx"];  //查詢結果中的任何字段值都可以以索引的方式查出,記得轉換為字段的實際類型

   是不是So Easy!

 

4、更複雜的sql邏輯,那得用存儲過程

   製造生產類的企業的業務邏輯離不開流程加表單,表單的查詢與數據寫入就是屬於比較複雜的sql了。

  但是這其實還不算什麼,更複雜的是,由於現在流行的大數據概念,車間的主管們往往也想沾沾邊,所以會在車間的大屏上展現各種數據統計的看板,這其中就涉及到巨多表的查詢邏輯。曾經開發過一個看板功能,特地數了一下,單單一條sql就接近200行的代碼量,一點都不誇張。像這種邏輯很複雜的查詢,還可能涉及到依據不同條件執行不同sql的場景,我當然不會在高級語言中拼接原生sql了,因為那樣容易把自己搞暈哦。這個時候就要祭出最後的大殺技——存儲過程。

  在CoffeeSQL中你可以這樣使用存儲過程:

 1     using (ShowYouDbContext dbContext = new ShowYouDbContext())
 2     {
 3         string strsp = "xxx_storeprocedureName";
 4 
 5         OracleParameter[] paras = new OracleParameter[]
 6         {
 7             new OracleParameter("V_DATE",OracleDbType.Varchar2,50),
 8             new OracleParameter("V_SITE",OracleDbType.Varchar2,50),
 9             new OracleParameter("V_SCREEN",OracleDbType.Varchar2,50),
10             new OracleParameter("V_SHIFT",OracleDbType.Varchar2,50),
11             new OracleParameter("V_CURSOR",OracleDbType.RefCursor)
13 }; 14 15 paras[0].Value = info.date; 16 paras[1].Value = info.site; 17 paras[2].Value = info.screenKey; 18 paras[3].Value = info.shift; 19 paras[4].Direction = ParameterDirection.Output;21 22 DataSet ds = dbContext.StoredProcedureQueryable(strsp, paras).ToDataSet(); 23 24 return ds; 25 }

  這裏的用法並沒有做什麼包裝,值得一提的就是可以將查詢結果轉換為對象。當然,這是貫穿整個ORM框架的一大主要功能,無處不在。

 

5、數據庫連接管理,一主多從

  現如今大多數的數據庫都不是單一部署的,比較流行的數據庫部署方式是“一主多從”的方式,即一台數據庫作為寫入數據的數據庫(主庫),其他多台數據庫作為讀取數據的數據庫(從庫)去同步主庫的數據,從而實現了讀寫分離的功能,降低了主庫的訪問壓力,大大提高了數據庫的訪問性能。當然,我們現在所討論的這個ORM框架就理所當然地要支持這種“一主多從”的數據庫部署方式的數據庫操作。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

  具體“一主多從”的數據庫連接配置方式如下:

 1     public class ShowYouDbContext : OracleDbContext<ShowYouDbContext>
 2     {
 3         private static string writeConnStr = "xxxxxxx_1";
 4         private static string[] readConnStrs = new string[] {
 5 
 6             "xxxxxxxxx_2",
 7             "xxxxxxxxx_3",
 8             "xxxxxxxxx_4",
 9             "xxxxxxxxx_5",
10             "xxxxxxxxx_6"
11         };
12 
13         public ShowYouDbContext() : base(writeConnStr, readConnStrs)
14         {
15         }
16     }

  對DBContext類對象進行構造時將數據庫連接字符串當做構造參數傳入即可,第一條為主庫(寫數據庫)連接字符串,以後的都為從庫(讀數據庫)連接字符串。 

 

6、實體數據驗證,作為數據格式規範的防線

  實體數據驗證的概念很好理解:一個數據表中的每一個字段都有其長度、大小等限制,那麼每一個與數據表對應的實體也應當有相應的字段約束來作為數據格式規範的防線,讓持久化到數據表中的數據符合其所規定的的格式,也就相當於貨物在進入倉庫前做一個安全檢查。

  我們可以像這樣去配置一個實體類的數據驗證規則:

 1     [Table("B_DICTIONARY")]
 2     public class Dictionary : EntityCommon
 3     {
 4         [Length(1,50)]
 5         [Column]
 6         public string Name { get; set; }
 7         [Column]
 8         public string Value { get; set; }
 9         [Column]
10         public string Type { get; set; }
11     }

  這個實體類中的Name字段就標識了一個LengthAttribute標籤,規定了該字段的長度範圍為1~50,如果不符合則會拋出異常。當然,實體數據的驗證規則不止這一條,後期會根據需求再進行添加,或者用戶可以根據自己的需求進行擴展。

 

7、事務的操作形式,個人習慣,喜歡把transaction明確寫出來,不喜歡過度封裝

  事務是數據庫系統中的重要概念,事務的特性是ACID(原子性、一致性、隔離性、持久性),當然這裏不會去討論事務的概念,我要展示的是在CoffeeSql中如何使用事務:

 1     try
 2     {
 3         dbContext.DBTransaction.Begin();
 4 
 5         dbContext.Update<Machine_Match_Relation>(d => new { d.Del_Flag }, new Machine_Match_Relation { Del_Flag = 1 })
            .Where(d => d.Screen_Machine_Id.Equals(displayDeviceId)).Done(); 6 7 foreach(string bindDeviceId in bindDeviceIds) 8 { 9 dbContext.Add(new Machine_Match_Relation 10 { 11 Id = Utils.GetGuidStr(), 12 Screen_Machine_Id = displayDeviceId, 13 Machine_Id = bindDeviceId, 14 Creater = updater 15 }); 16 } 17 18 dbContext.DBTransaction.Commit(); 19 } 20 catch(Exception ex) 21 { 22 dbContext.DBTransaction.Rollback(); 23 throw ex; 24 }

  有人會說為什麼這裏不封裝一個方法,只要傳入業務操作代碼的委託Action就行了,當然可以,但是說實在的,真沒必要,如果你喜歡就自己封裝去吧。

 

8、可適配擴展多款不同的數據庫 

  作為一個能跟的上潮流的ORM,當然得具備適配多種數據庫的特性了,Oracle、Mysql、SqlServer等等數據庫,想怎麼適配就怎麼適配。

 1     //Mysql
 2     public class WQSDbContext : MysqlDbContext<WQSDbContext>
 3     {
 4         public WQSDbContext() : base(mysqlConnStr)
 5         {
 6             this.OpenQueryCache = false;
 7             this.Log = context =>
 8             {
 9                 Console.WriteLine($"sql:{context.SqlStatement}");
10                 Console.WriteLine($"time:{DateTime.Now}");
11             };
12         }
13     }
14 
15     //Oracle
16     public class WQSDbContext : OracleDbContext<WQSDbContext>
17     {
18         public WQSDbContext() : base(oracleConnStr)
19         {
20             this.OpenQueryCache = false;
21             this.Log = context =>
22             {
23                 Console.WriteLine($"sql:{context.SqlStatement}");
24                 Console.WriteLine($"time:{DateTime.Now}");
25             };
26         }
27     }

   目前CoffeeSQL實現了兩種數據庫的擴展,Oracle與Mysql。當然,如果你還想適配更多的數據庫的話,你也可以嘗試擴展,只不過我目前用到的這兩種數據庫。

 

9、緩存功能,提高性能

  還記得當初一次校招的面試,面試官問我:“你覺得ORM的速度快還是Ado.net的速度快?”

     我傻傻地脫口而出:“那當然是Ado.net更快了,相比於ORM,它少了linq語句到sql的轉換步驟,而且ORM還比直接使用Ado.net多了查詢結果映射到對象的步驟。”

  看面像和發量就知道這個面試官 心()地()善()良(,他和我對視了3秒,然後說:

  “好,今天就到這,回去等通知吧!”

   等通知的後果那也就顯而易見了……

  

  直到後來我深入地了解了ORM框架的原理才知道,那個問題並不是我回答的一句話那麼簡單,因為我忽略了ORM緩存

   CoffeeSql中也會有ORM緩存,ORM的緩存分為表緩存(二級緩存)sql語句緩存(一級緩存):表緩存一般用於數據量較小且經常會進行查詢操作的表,會將整個表的數據緩存到緩存介質中;sql語句緩存可以適用各種類型的表,它是以sql查詢語句作為緩存鍵的。

  當然,你如果並不想要知道太多其中的細節,在使用時你只需要像這樣簡單的配置:

  (ORM緩存開關)

1     public class WQSDbContext : OracleDbContext<WQSDbContext>
2     {
3         public WQSDbContext() : base(oracleConnStr)
4         {
5             this.OpenTableCache = true;
6             this.OpenQueryCache = true;
7         }
8     }

  (表緩存的實體配置)

 1     [TableCaching]
 2     [Table("B_DICTIONARY")]
 3     public class Dictionary : EntityCommon
 4     {
 5         [Column]
 6         public string Name { get; set; }
 7         [Column]
 8         public string Value { get; set; }
 9         [Column]
10         public string Type { get; set; }
11     }

   如果在實體類上標記TableCachingAttribute而且打開了表緩存,那麼就會對當前的數據表進行全表數據的緩存。

  要注意,表緩存一般只用在小數據量且查詢頻繁的表中。因為表緩存功能啟用後會事先去將全表的數據掃描然後存儲到本地緩存,直接在緩存中進行表數據的查詢操作,所以如果你將那種數據量很大且查詢並不是很頻繁的表開啟了表緩存,那你可以想象一下這個肯定會是一個得不償失的行為。

 

   以上的代碼操作是我當初對CoffeeSQL的預想,當然,現在都成為了現實。以上的內容實際上就相當於CoffeeSQL的操作手冊,因為上面的代碼完全是按照實際的CoffeeSQL的框架操作來進行展示的。

     有關於CoffeeSQL更詳細的使用細節我會在源碼的測試代碼中給出,觀眾們可以移步去看源碼:

   https://gitee.com/xiaosen123/CoffeeSqlORM

  本文為作者原創,轉載請註明出處:https://www.cnblogs.com/MaMaNongNong/p/12896757.html

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

美豬供應量超過需求 豬隻恐被安樂死_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

摘錄自2020年4月21日自由時報報導

美國各地學校和餐廳因武漢肺炎疫情紛紛關閉,而這兩者可以說是豬肉的最大消費者,因此連帶地讓豬肉供應超過需求,目前每在市場上賣出一頭豬可能會賠37美元(約新台幣1112元),在這種情況下豬隻也許會被安樂死。

據《福斯新聞》報導,美國目前約有6萬名養豬戶,愛荷華州豬肉生產協會會長帕斯蒂安(Mike Paustian)指出,現在豬價如此低的原因之一,在於食品和消費者之間的聯繫受到了干擾,另一個迫在眉睫的問題是,隨著賣不出去豬越長越大,已超過了加工廠的標準。

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

美國農業部(USDA)對此已宣布了武漢肺炎紓困計劃,其中包括計劃購買30億美元(約新台幣900億元)農產品和向養豬戶直接支付16億美元(約新台幣480億元)。

國際新聞
美國
家豬
安樂死
經濟動物
動物福利

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

字符串太占內存了,我想了各種奇思淫巧對它進行壓縮_潭子電動車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

一:背景

1. 講故事

在我們的一個全內存項目中,需要將一家大品牌店鋪小千萬的trade灌入到內存中,大家知道trade中一般會有訂單來源,省市區 ,當把這些字段灌進去后,你會發現他們特別侵蝕內存,因為都是字符串類型,不知道大家對內存侵蝕性是不是很清楚,我就問一個問題。

Question: 一個空字符串佔用多大內存? 你知道嗎?

思考之後,下面我們就一起驗證下,使用windbg去託管堆一查究竟,代碼如下:


        static void Main(string[] args)
        {
            string s = string.Empty;

            Console.ReadLine();
        }

0:000> !clrstack -l
OS Thread Id: 0x308c (0)
        Child SP               IP Call Site
ConsoleApp6.Program.Main(System.String[]) [C:\dream\Csharp\ConsoleApp1\ConsoleApp6\Program.cs @ 19]
    LOCALS:
        0x00000087391febd8 = 0x000002605da91420
0:000> !DumpObj /d 000002605da91420
Name:        System.String
String:      
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ff9eb2b85a0  4000281        8         System.Int32  1 instance                0 m_stringLength
00007ff9eb2b6838  4000282        c          System.Char  1 instance                0 m_firstChar
00007ff9eb2b59c0  4000286       d8        System.String  0   shared           static Empty
                                 >> Domain:Value  000002605beb2230:NotInit  <<
0:000> !objsize 000002605da91420
sizeof(000002605da91420) = 32 (0x20) bytes (System.String)

從圖中你可以看到,僅僅一個空字符串就要佔用 32byte,如果500w個空字符串就是: 32byte x 500w = 152M,是不是不算不知道,一算嚇一跳。。。 這還僅僅是一個什麼都沒有的空字符串哦。

2. 回歸到Trade

問題也已經擺出來了,接下來回歸到Trade中,為了方便演示,先模擬以文件的形式從數據庫讀取20w的trade。

    class Program
    {
        static void Main(string[] args)
        {
            var trades = Enumerable.Range(0, 20 * 10000).Select(m => new Trade()
            {
                TradeID = m,
                TradeFrom = File.ReadLines(Environment.CurrentDirectory + "//orderfrom.txt")
                                 .ElementAt(m % 4)
            }).ToList();

            GC.Collect();  //方便測試,把臨時變量清掉
            Console.WriteLine("執行成功");
            Console.ReadLine();
        }
    }

    class Trade
    {
        public int TradeID { get; set; }
        public string TradeFrom { get; set; }
    }

然後用windbg去跑一下託管堆,再量一下trades的大小。


0:000> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
00007ff9eb2b59c0   200200      7010246 System.String

0:000> !objsize 0x000001a5860629a8
sizeof(000001a5860629a8) = 16097216 (0xf59fc0) bytes (System.Collections.Generic.List`1[[ConsoleApp6.Trade, ConsoleApp6]])

從上面輸出中可以看到託管堆有200200 = 20w(程序分配)+ 200(系統分配)個,然後再看size: 16097216/1024/1024= 15.35M,這就是展示的所有原始情況。

二:壓縮技巧分析

1. 使用字典化處理

其實在託管堆上有20w個字符串,但你仔細觀察一下會發現其實就是4種狀態的重複显示,要麼一淘,要麼淘寶。。。這就給了我優化機會,何不在獲取數據的時候構建好OrderFrom的字典,然後在trade中附增一個TradeFromID記錄字典中的映射值,因為特徵值少,用byte就可以了,有了這個思想,可以把代碼修改如下:

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污


    class Program
    {
        public static Dictionary<int, string> orderfromDict = new Dictionary<int, string>();

        static void Main(string[] args)
        {
            var trades = Enumerable.Range(0, 20 * 10000).Select(m =>
            {
                var tradefrom = File.ReadLines(Environment.CurrentDirectory + "//orderfrom.txt")
                                 .ElementAt(m % 4);

                var kv = orderfromDict.FirstOrDefault(k => k.Value == tradefrom);

                if (kv.Key == 0)
                {
                    orderfromDict.Add(orderfromDict.Count + 1, tradefrom);
                }

                var trade = new Trade() { TradeID = m, TradeFromID = (byte)kv.Key };

                return trade;

            }).ToList();

            GC.Collect();  //方便測試,把臨時變量清掉

            Console.WriteLine("執行成功");

            Console.ReadLine();
        }
    }

    class Trade
    {
        public int TradeID { get; set; }

        public byte TradeFromID { get; set; }

        public string TradeFrom
        {
            get
            {
                return Program.orderfromDict[TradeFromID];
            }
        }
    }

代碼還是很簡單的,接下來用windbg看一下空間到底壓縮了多少?

0:000> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
00007ff9eb2b59c0      204        10386 System.String

0:000> !clrstack -l
OS Thread Id: 0x2ce4 (0)
        Child SP               IP Call Site
ConsoleApp6.Program.Main(System.String[]) [C:\dream\Csharp\ConsoleApp1\ConsoleApp6\Program.cs @ 42]
    LOCALS:
        0x0000006f4d9ff078 = 0x0000016fdcf82ab8

0000006f4d9ff288 00007ff9ecd96c93 [GCFrame: 0000006f4d9ff288] 
0:000> !objsize 0x0000016fdcf82ab8
sizeof(0000016fdcf82ab8) = 6897216 (0x693e40) bytes (System.Collections.Generic.List`1[[ConsoleApp6.Trade, ConsoleApp6]])

從上面的輸出中可以看到,託管堆上string現在是:204 = 4(程序分配) + 200(系統分配)個,這4個就是字典中的4個哦,空間的話:6897216 /1024/1024= 6.57M,對應之前的 15.35M優化了將近60%。

雖然優化了60%,但這種優化是破壞性的優化,需要修改我的Trade結構,同時還要定義個Dictionary,而且還有不小幅度的修改業務邏輯,大家都知道線上的代碼是能不改則不改,不改肯定沒錯,改出問題肯定是你兜着走,是吧,那問題就來了,如何最小化的修改而且還能壓縮空間,有這樣兩全其美的事情嗎???

2. 利用字符串駐留池

貌似一說出來,大家都如夢初醒,駐留池的出現就是為了解決這個問題,CLR會在內部維護了一個我剛才定義的字典機制,重複的字符串就不需要在堆上再次分配,直接存它的引用地址即可,如果你不清楚駐留池,建議看一下我這篇: https://www.cnblogs.com/huangxincheng/p/12799736.html

接下來只需要在tradefrom 字段包一層 string.Intern 即可,改動不要太小,代碼如下:


        static void Main(string[] args)
        {
            var trades = Enumerable.Range(0, 20 * 10000).Select(m => new Trade()
            {
                TradeID = m,
                TradeFrom = string.Intern(File.ReadLines(Environment.CurrentDirectory + "//orderfrom.txt")
                                 .ElementAt(m % 4)),   //包一層 string.Intern
            }).ToList();

            GC.Collect();  //方便測試,把臨時變量清掉
            Console.WriteLine("執行成功");
            Console.ReadLine();
        }

然後用windbg抓一下託管堆。


0:000> !dumpheap -stat 
Statistics:
              MT    Count    TotalSize Class Name
00007ff9eb2b59c0      204        10386 System.String

0:000> !clrstack -l
OS Thread Id: 0x13f0 (0)
        Child SP               IP Call Site

ConsoleApp6.Program.Main(System.String[]) [C:\dream\Csharp\ConsoleApp1\ConsoleApp6\Program.cs @ 27]
    LOCALS:
        0x0000005e4d3ff0a8 = 0x000001f8a15129a8

0000005e4d3ff2b8 00007ff9ecd96c93 [GCFrame: 0000005e4d3ff2b8] 
0:000> !objsize 0x000001f8a15129a8
sizeof(000001f8a15129a8) = 8497368 (0x81a8d8) bytes (System.Collections.Generic.List`1[[ConsoleApp6.Trade, ConsoleApp6]])

觀察后發現,當用了駐留池之後空間為: 8497368 /1024/1024 =8.1M,你可能有疑問,為什麼和字典化相比內存要大24%呢? 仔細觀察你會發現,當用駐留池后,List<Trade> 中的TradeFrom存的是string在堆中的內存地址,在x64機器上要佔用8個字節,而字典化方式內存堆上Trade是不分配TradeFrom,而是用了一個byte來替代,總體來說相當於一個trade省了7byte的空間,然後用windbg看一下。


0:000> !da -length 1 -details 000001f8b16f9b68
Name:        ConsoleApp6.Trade[]
Size:        2097176(0x200018) bytes
Array:       Rank 1, Number of elements 262144, Type CLASS

    Fields:
                      MT    Field   Offset                 Type VT     Attr            Value Name
        00007ff9eb2b85a0  4000001       10             System.Int32      1     instance                    0     <TradeID>k__BackingField
        00007ff9eb2b59c0  4000002        8            System.String      0     instance     000001f8a1516030     <TradeFrom>k__BackingField

0:000> !DumpObj /d 000001f8a1516030
Name:        System.String
String:      WAP

可以看到, 000001f8a1516030 就是 堆上 string=Wap的引用地址,這個地址佔用了8byte空間。

再回頭dump一下使用字典化方式的Trade,可以看到它是沒有 <TradeFrom>k__BackingField 字段的。


0:000> !da -length 1 -details 000001ed52759ac0
Name:        ConsoleApp6.Trade[]
Size:        262168(0x40018) bytes
Array:       Rank 1, Number of elements 32768, Type CLASS
    Fields:
                      MT    Field   Offset                 Type VT     Attr            Value Name
        00007ff9eb2b85a0  4000002        8             System.Int32      1     instance                    0     <TradeID>k__BackingField
        00007ff9eb2b7d20  4000003        c              System.Byte      1     instance                    0     <TradeFromID>k__BackingField


三:總結

大家可以根據自己的情況使用,使用駐留池方式是改變最小的,簡單粗暴,自己構建字典化雖然最省內存,但需要修正業務邏輯,這個風險自擔哦。。。

如您有更多問題與我互動,掃描下方進來吧~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!