智慧電動機車與電池交換站體系並進,Gogoro 打造「平民特斯拉」

  台灣新創企業 Gogoro 挾著創辦人陸學森、主要投資人尹衍樑,以及 1.5 億美元募資總額,吸引了產業界的注意。Gogoro 揭櫫智慧城市與智慧能源的大方向,但主要專利卻集中在電動機車相關領域,電動機車與智慧城市的連結乍看似乎有些牽強,使得產業界相當好奇 Gogoro 為何研發機車卻言必稱智慧城市?   至 CES 2015,謎底揭曉,Gogoro 一方面展出設計與功能上均讓人驚豔的智慧電動機車,但更重要的戰略性意義,則在於搭配機車的電池交換站體系之上,電池交換站體系不僅作為電動機車的後勤系統,更可望藉由機車位入口,打進未來智慧城市基礎建設的重要領域。   Gogoro 先前對其產品三緘其口,頗有蘋果飢餓行銷策略之風範,也成功的引起媒體關注與好奇,CES 2015 上正式發表產品後,國內外多家科技媒體均第一時間報導,一時成為產業新聞熱門焦點,Gogoro 此次產品發表,較引人注目的主體是智慧電動機車,但實際上,Gogoro 可說是同時發表兩種產品,電動機車只是其一,電動機車的電池交換站則可說是另一個關鍵產品,兩者的戰略性一樣重要。  
 

   
革新電動車充電   Gogoro 電池交換站「GoStation」,系統設計風格相當簡潔,大小約如同一般的 ATM 機台,全白機身微微傾斜,上有 8 個容納電池的槽孔,頂端為智慧面板,旁邊可以單體 8 個槽孔為單位擴充,以利在熱門地段,能提供更多交換用電池,電池上有綠色提把設計,點綴於白色整體外觀之中,可說兼具時尚與實用的風格,這樣的設計可說較為偏向消費性電子產品風格,而非傳統的汽機車設計風格。  
 

    Gogoro 電動機車使用的電池與特斯拉(Tesla)Model S 電動車相同,為 Panasonic 18650 鋰電池,這呼應了先前 Gogoro 與 Panasonic 合作的消息,電池外觀大小有如鞋盒大小,重約 9 公斤,為一般人雙手可提起的重量,內建 NFC 等 25 種感測器,Gogoro 主打電池交換概念,當機車騎到電池沒電時,並不用慢慢等著充電,而是騎到 GoStation,將機車電池取出,放入空槽孔中,6 秒鐘後,會由其他槽孔跳出充滿電力的電池,拿取後直接上路。  
 

    (Source:)   過去電動機車為人詬病之處就是充電慢、行駛距離不足,但若能在城市中遍布 GoStation,則可解決此二個問題,因為隨時交換電池只需 6 秒鐘,只要在 GoStation 普及的範圍內,可說實際上不用擔心行駛距離問題,而由於機車在亞洲大多為市區交通,如通勤、快遞送貨等使用,只要能在市區內普遍設立 GoStation,就可大為提升電動機車的實用性,解除過去電動機車銷售上最大的障礙。而 GoStation 設置成本也並不高,每座約為 1 萬美元。    
邁入智慧城市   另一方面,GoStation 與交通有關、存有大量電池,並與電力網路相連結的特性,一旦普遍設立,將成為進軍智慧城市的踏腳石。   智慧城市的重要領域包括交通、能源、水資源、保健、廢棄物處理等領域,GoStation 的交換資料,能夠讓城市政府交通相關單位掌握機車的使用熱點,進而做出更好的市政規劃,而 GoStation 內部存放大量充電中的電池,在歐美,類似的設施,如特斯拉的電池交換站,都設想到可以同時作為智慧電網的一環,如當市區內某區域能源需求突增,可由附近的站點暫停充電,甚至從電池饋電,來因應變化,而不至於跳電,而 GoStation 也可能在夜間電力離峰時間充電,降低白天尖峰的用電壓力。  
 

 

  除此之外,《富比世》(Forbes)報導,陸學森表示,當大都會人口成長,尖峰用電需求不斷上升,想像 Gogoro 智慧電動機車與 GoStation 能收集車主何時、在何處交通的資料,將有助於城市的智慧電網了解與預測用電需求,因而能提早因應。如此一來,城市電力網路將不必為了尖峰流量而大幅擴建或更新輸配系統,可節省大量預算。   陸學森接受科技媒體《SlashGear》採訪時也指出,在都會化的趨勢下,世界最終將有 6 成人口居住在大城市之中,而目前的都市居民有 12% 的收入,都花費在能源相關的開銷上,其中有一半是汽油,若能節約這一大部分的開支,不僅對人類有幫助,也是廣大的市場,更有助於降低全球碳排放。   由此可知,GoStation 不僅只是推動電動機車的推手,其最終願景為協助城市以及電力網路智慧化。此外,GoStation 的智慧面板,若與智慧城市的資訊系統結合,不僅可提供氣候等資訊,甚至可能作為智慧服務功能。    
以亞洲都市為起點   智慧城市目前為全球主流趨勢,在台灣也成為多個市政府的重要施政目標,如台北市長柯文哲即期望建立智慧政府、智慧城市與智慧市民,也因此造成資訊局長一度難產,最初柯文哲市長期待新任資訊局長能夠成為台北智慧城市的資訊長,然而,智慧城市牽涉專業領域過廣,並非單一一人所能勝任,所需要的人才規格,也非市政府的薪資標準所能負擔,於是有了「香蕉的待遇只能僱到猴子」之嘆,最後折衷辦法為市府成立智慧城市委員會,由各領域專業的委員協助制定策略,資訊局負責執行。   由台北市資訊局長一度難產,可看出智慧城市千頭萬緒,對每個城市來說都是相當大的挑戰,若城市內以機車需求,由民間力量普設 GoStation,將可成為智慧城市推動的一大助力。  
 
 
 
 
 
  (Source:)
 
 
 
 
    Gogoro 於 CES 2015 中透露,2015 年將於一個亞洲城市開始進行 GoStation 計畫,但尚未明言將為哪個城市,可說繼承一貫的飢餓行銷策略,推測 Gogoro 可能於下一個消費性電子展會或是汽機車重要展會發表其首要主打城市。而《富比世》則報導,Gogoro 將選擇超過 1,000 萬人口的大都會,作為第一個起步的城市。    
消費性電子產品設計思維   然而,如此廣大的願景,仍然要 Gogoro 的智慧電動機車本身成功,才有可能成真。在機車本身,Gogoro 的表現可說也讓人相當驚艷,其機車的設計可說跳脫了傳統電動機車的既定印象,與 GoStation 的設計風格一樣,偏向消費性電子產品風格,而非傳統的汽機車設計風格,多家歐美科技媒體認為,這樣的特立獨行風格,來自於陸學森為設計消費性電子產品出身,過去從未設計過機車。但如此一來,反而帶來了新鮮感。科技媒體《The Verge》譽為「你所買得起最酷的機車」。   機車車身與零組件也與過去電動機車不同,並不利用現有機車零組件,全數零組件含傳動系統、懸吊系統、前後輪碟煞、LED 車燈、底盤與所有的電子系統都是由 Gogoro 原創設計打造。  

  機車的車身可說以輕便、小巧、簡潔的都市風格為主,在性能上,可由停車狀態在 4.2 秒鐘內加速到 30 英里(48.3 公里),最高速度約達 60 英里(96.6 公里),內建雙電池槽,兩個電池都充滿電的狀態下,行駛距離達 100 公里,以市區行駛來說這樣的性能與續航力已經相當足夠,CES 2015 上 Gogoro 更展示機車壓車快速轉彎與燒胎,宣告其智慧電動機車絕非過去一般人印象中「無力」的舊式電動機車。  

    (Source:)   目前全球機車市場最主流的機車為 125cc 車種,約佔 8 成市場,Gogoro 也以 125cc 為「假想敵」,其傳動系統動力在鋁輕量化車身上的表現,比 125cc 對手快上 16%。而 Gogoro 機車也加強防水性,而比內燃機機車防水性更佳,當亞熱帶地區下大雨積水,傳統機車擔心排氣管浸水拋錨,Gogoro 機車卻沒有這樣的顧慮。   Gogoro 強調其產品為智慧電動機車(Smartscooter),非僅是一般電動機車,身為智慧產品,除了頭燈會在天色暗時自動開啟這種智慧功能以外,與智慧型手機的連結更是重點。  
 

     
電動車與智慧手機的結合   陸學森曾於宏達電任職的經歷,為 Gogoro 帶來了更完整的與智慧型手機整合的概念,除了會在智慧型手機 app上顯示基本的行駛路線、電池電力等資料,可以用 app 開行李箱,以及可透過手機 app 個人化設定諸如機車面板顏色、鎖車燈號顏色等等以外,車身上有 30 種感測器,含電池上的 25 種感測器,隨時檢查車身與電池狀況,每 10 分鐘回報,若是車子有了任何問題,就會即時在手機上通知車主,若是車主沒有看手機,則會在下次交換電池時,在 GoStation 的智慧螢幕上通知車主,確保車主的安全。  
 

  (Source:)   Gogoro 智慧電動機車還有一個對手機重度使用者最貼心的功能:在行李箱裡頭就有 USB 埠可以幫手機充電。   車身上的感測器更結合了演算法,當車主買回 Gogoro 智慧電動機車,開始騎乘後,感測器收集的資料,會讓智慧電動機車不斷學習車主的行駛模式,一邊調整能源管理模式,最後,機車的能源管理,將能完全配合車主的日常需求,達到最省電的效果。    
用手機模式走一條不一樣的路   甚至連電動機車的商業模式也可能模仿手機。手機往往與電信業者結合,以便宜價格推出,但是收取服務費用,《富比世》報導,Gogoro 表示,電動車最大的成本來源就是電池,電池本身佔 4 成成本,若把電池與充電迴路除去,機車車身成本就會大為降低,如此一來,Gogoro 將可以追求手機商業模式,也就是說,機車本身以相當低廉的價格販售,主要從電池充電服務收費來得到營收。   如此一來,更能避免電動機車過去不能普及的另一個主要障礙:價格過高。Gogoro 雖然尚未宣布其價格,但預期若在手機商業模式下的補貼後,將比想像中低,由於其設計風格,與可能的低價,相對於特斯拉的高價,科技媒體《SlashGear》將 Gogoro 譽為「平民特斯拉」(Tesla for the everyone)。   大部分國內媒體,將 Gogoro 視為一般電動機車報導,但從許多外媒報導可看出,歐美媒體以及產業界已經看出 Gogoro 的野心與潛力,全球目前估計約有 2 億輛機車,而機車產業已經幾乎 20 年沒有重大創新,的確是進行破壞式創新的適當領域,而 Gogoro 結合智慧城市概念的遠大願景,將從哪個城市開始落實,發展是否順利,不僅是電動機車界動見觀瞻,也將成為智慧能源與智慧城市領域的注意焦點。   (首圖來源:)      本文全文授權轉載自《科技新報》─〈〉

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

電動車免牌照稅 可望延長至 2018 年

為鼓勵購買低汙染的環保車輛,電動汽車將再延長牌照稅免稅期 3 年。包括電動小客車、巴士與貨車,免徵牌照稅優惠將可持續至 2018 年 1 月 5 日為止。   為基於扶植國內電動車研發製造的需要,立法院財政委員會 12 日將審查由行政院提出的用牌照稅法修正草案,授權給地方政府對以電能為動力的電動汽車,免徵牌照稅優惠期間,可以再延長 3 年。經濟日報指出,這項減稅法案可望趕在立法院本會期結束前完成修法程序,以便接續提供減免。   財政部指出,免徵電動車使用照稅優惠措施自 2012 年 1 月 5 日施行至今,國庫釋出的免稅利益將近新台幣 1,000 萬元,平均每年約為 300 萬元。過去 3 年,申請免稅的電動車由 319 輛成長到 574 輛,減稅金額也從約 200 萬元倍增至近 400 萬元。財政部認為,電動車申請免稅案件逐年增加,代表電動車的使用與購買意願也在上升。  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

python高級-閉包-裝飾器

閉包內容:

  1. 匿名函數:能夠完成簡單的功能,傳遞這個函數的引用,只有功能

  2. 普通函數:能夠完成複雜的功能,傳遞這個函數的引用,只有功能

  3. 閉包:能夠完成較為複雜的功能,傳遞這個閉包中的函數以及數據,因此傳遞是功能+數據

  4. 對象:能夠完成最複雜的功能,傳遞很多數據+很多功能,因此傳遞的是數據+功能

———————————————————

  1. 對全局函數進行修改:在函數當中加global,在閉包中外邊中的變量加nonlocal

  2. 閉包定義:有兩個函數嵌套使用,裏面的函數可以使用外面函數所傳輸的參數,最後可傳遞的是裏面函數的結構與數據(個人理解)。

  3. 最後閉包可以在python中引申出裝飾器 ———————————————————

 1 def closure():
 2     # 在函數內部再定義一個函數,
 3     # 並且這個函數用到了外邊函數的變量,那麼將這個函數以及用到的一些變量稱之為閉包
 4     def closure_in(x):
 5         print('---------我是打不死的%s--------' %x)
 6     return closure_in
 7  8 x = closure()
 9 x('小強')
10 11 print('*'*20)
12 # -----加餐---------
13 def closure_1(a,b,c):
14     def closure_on(x):
15         print('-----%s加餐-------' %b)
16         print(a*x + c)
17     return closure_on
18 19 demo = closure_1(2,'小強',3) #傳closure_1函數
20 demo(4) #傳clsure_on函數
21 22 #注:函數不加括號,調用的是函數本身【function】;函數加括號,調用的是函數的return結果。

 

裝飾器內容:

代碼要遵守‘開放封閉’原則;對已經寫好的函數遵守封閉,對功能擴展遵守開放;

 1 # 裝飾器的作用:為了對原來的代碼上進行擴展
 2 def decoration(func):
 3     def call_func():
 4         print('-------正在裝飾 -------' )
 5         func()
 6     return call_func
 7  8 #@decoration     #--->demo_new = decoration(demo)
 9 def demo():
10    print('demo----')
11 12 demo_new = decoration(demo)
13 demo_new()

 

使用裝飾器來測試一個函數的運行時:

 1 import time
 2 def set_func(func):
 3     def call_func():
 4         start_time = time.time()
 5         func()
 6         stop_func = time.time()
 7         print(‘alltimes is %f’ %(stop_func-start_fun))
 8     return call_func
 9 @set_func
10 def test1():
11     print(‘——-test1———’)    
12 test1()
13 14 #等價於:
15 @set_func==test1 = set_func(test1)
16

 

1. 沒有參數,沒有返回值的函數進行裝飾:
 1 def set_func(func):
 2     def call_func():
 3         print(‘———test2——-’)
 4         print(‘———-test3——’)
 5         func()
 6     return call_func
 7     
 8 @set_func
 9 def test1():
10     print(‘——test1——-   ’)

 

2. 對有參數無返回值的函數進行裝飾:
 1 def set_func(func):
 2     def call_func(a):  #
 3         print(‘———test2——-’)
 4         print(‘———-test3——’)
 5         func(a) #
 6     return call_func
 7     
 8 @set_func
 9 def test1(num):
10     print(‘——test1——- %d    ’ %num)
11 12 test1(100) —->call_func(100)
13 test1(200)——>call_func(200)

 

復現裝飾器原理:

————————————————————————-

只要遇到@函數 裝飾器(這句話),在程序中就已經執行了!!
3. 不定長參數的函數裝飾:
 1 def set_func(func):
 2     def call_func(*args,**kwargs):  #
 3         print(‘———test2——-’)
 4         print(‘———-test3——’)
 5         func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;
 6         #func(args,kwargs)—>不行,相當於傳遞了兩個參數:一個元祖,一個字典。
 7     return call_func
 8     
 9 @set_func
10 def test1(num,*args,**kwargs):
11     print(‘——test1——- %d    ’ %num)
12     print(‘——test1——-   ’ , args)
13     print(‘——test1——- ’ ,kwargs )
14     
15 test1(100)  
16 test1(100,200)
17 test1(100,200,300,mm=100)

注意:*args保存不定長參數,以元祖保存,**kwargs保存字典形式(mm=…)

4.對應的返回值參數進行裝飾、通用裝飾器:
 1 #通用裝飾器
 2 def set_func(func):
 3     print(“開始進行裝飾———-”)
 4     def call_func(*args,**kwargs):  #
 5         print(‘———test2——-’)
 6         print(‘———-test3——’)
 7         return func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;如果沒有return ret返回none。
 8         #func(args,kwargs)—>不行,相當於傳遞了兩個參數:一個元祖,一個字典。
 9     return call_func
10     
11 @set_func
12 def test1(num,*args,**kwargs):
13     print(‘——test1——- %d    ’ %num)
14     print(‘——test1——-   ’ , args)
15     print(‘——test1——- ’ ,kwargs )
16     return ‘ok’    #—-返回給上面的func(),然後return func—ret
17     
18 ret = test1(100)
19

 

5. 多個裝飾器對同一個函數進行裝飾:
 1 def add_qx(func):
 2     print(“——開始進行裝飾權限1———-”)
 3     def call_func(*args,**kwargs):  #
 4         print(‘這是權限驗證1’)
 5         return func(*args,**kwargs)
 6     return call_func
 7     
 8  9 def add_xx(func):
10     print(“——開始進行裝飾xx功能———-”)
11     def call_func(*args,**kwargs):  #
12         print(‘這是xx權限驗證’)
13         return func(*args,**kwargs)
14     return call_func
15     
16 @add_qx
17 @add_xx
18 def test1():
19     print(‘——test1——-’) 
20 21 test1()
22

 

首先執行第一個,但是第一個裝飾器下面不是函數(裝飾器原則:下面必須是函數,否則不執行),所以第一個函數先等待,等第二個裝飾器執行后形成函數在交給第一個裝飾器;所以運行結果是:

  1. 開始進行裝飾xx的功能,

  2. 開始進行裝飾權限1,

  3. 這是權限驗證1,

  4. 這是xx權限驗證,

  5. ——-test1——-,

——————裝飾器練習—————- 輸出格式:<td><h1>haha</h1></td>

 1 def set_func_1(func):
 2     def call_func():
 3         return ‘<h1>’ + func() + ’</h1> 4     return call_func
 5     
 6  7 def set_func_2(func):
 8     def call_func():
 9         return ‘<td>’ + func() + ’</td>10     return call_func
11     
12 @set_func_1()
13 @set_func_2()
14 def get_str():
15     return ‘haha’
16     
17 print(get_str()) 

18 最後執行的效果: <h1><td>haha</td></h1>
6. 用類對函數進行裝飾(了解):
 1 class Test(object):
 2     def __init__(self,func):
 3         self.func = fun
 4         
 5     def __call__(self):
 6         print(‘這裡是裝飾器的功能。。。。’)
 7         return self.func()
 8         
 9 @Test
10 def get_str():
11     return ‘haha’
12     
13 print(get_str())

 

以上就是裝飾器與閉包的全部內容,希望有所收穫,如果有錯誤,希望指出,感謝!!

 

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

※教你寫出一流的銷售文案?

常見的索引模型淺析

  索引的出現是為了提高數據庫查詢的效率,就像書的目錄一樣。常見的索引模型有哈希表、有序數組、B+樹。

  • 自適應哈希索引(AHI)

  哈希表是一種常見的數據結構,即通過哈希算法計算出一個数字在表中的位置,並將数字存入該表。哈希索引就是通過哈希表來實現的,一般情況下查找時間複雜度為O(1)。InnoDB會監控對錶上各索引頁的查詢,會自動根據訪問的頻率和模式為某些熱點頁建立哈希索引,所以又叫自適應哈希索引,訪問模式一樣指查詢的條件一樣。

  比如我們維護一張身份證信息和用戶姓名的表,需要根據身份證號查詢姓名,哈希索引大概是這樣的:

  哈希索引適合只有等值查詢的場景,例如select * from T where index_col = ‘##’。哈希索引是無序的,如果需要區間查詢,那就要把所有數據掃描一遍。

  • 有序數組索引

  有序數組在等值查詢和區間查詢場景中效率都很高,同樣用上面的表舉例,索引大概是這樣的:

  要查詢某條數據或者區間的時候,使用二分法時間複雜度為O(logN)。但如果需要在中間更新數據時,那麼就要移動後面所有的數據。有序數組索引只適用於靜態存儲引擎,比如保存2019年度學校所有學生信息。

  • B+樹索引

  B+樹是為磁盤或其他直接存取輔助設備設計的一種平衡查找樹。下面是一顆高度為2的B+樹,所有記錄都在恭弘=叶 恭弘子結點上順序存放,恭弘=叶 恭弘子結點通過指針相連。

  B+樹索引就是B+樹在數據庫中的實現,由於B+索引在數據庫中具有高扇出性,在數據庫中B+樹的高度一般為2~4層。查找某一鍵值的行記錄時最多只需要2~4次IO。以InnoDB的一個整数字段索引為例,這顆B+樹大概是1200叉樹,這裏N叉樹的N取決於數據塊的大小。高度為4的時候就可以存1200的3次方個值,大概為17億。考慮到樹根的數據塊總是在內存中,一個10億行的表上一個整数字段的索引,查找一個值最多只需要訪問3次磁盤。

  在InnoDB存儲引擎中,表是根據主鍵順序存放的。根據恭弘=叶 恭弘子結點內容,B+樹索引又分為聚簇索引和輔助索引。

    • 聚簇索引:按照每張表的主鍵構造一顆B+樹,恭弘=叶 恭弘子結點的key是主鍵值, value是該行的其他字段值,聚簇索引的恭弘=叶 恭弘子結點也稱為數據頁。
    • 輔助索引:恭弘=叶 恭弘子結點的內容是主鍵的值。

我們用一個例子來說明上面的概念,創建一張表,在字段k上有索引:

create table T(
id int primary key, 
k int not null, 
name varchar(16),
index (k))engine=InnoDB;

  表中R1~R5的(ID,k)值分別為(100,1)、(200,2)、(300,3)、(500,5)和(600,6),兩顆B+樹如下,可以明顯看到這兩個顆樹的區別。

  使用普通索引查詢時,例如 select * from T where k = 2,需要先搜索k索引樹,得到ID的值為200;再到ID索引搜索一次。這個過程就叫做回表,非主鍵索引查詢需要多搜索一棵樹。

  參考資料:《MySQL實戰45講》

       《MySQL技術內幕:InnoDB存儲引擎》第二版

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

mybatis緩存之一級緩存(二)

這篇文章介紹下mybatis的一級緩存的生命周期

一級緩存的產生

一級緩存的產生,並不是看mappper的xml文件的select方法,看下面的例子

mapper.xml

    <select id="getById" resultType="entity.TempEntity">
       select * from  temp where id = #{id}
    </select>

test

    @Test
    public  void testSelectAsUpdate() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        sqlSession.update("dao.Temp03Dao.getById", 1);
        sqlSession.update("dao.Temp03Dao.getById", 1);
    }

執行結果

2020-06-26 17:33:27,899 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:33:27,922 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:33:27,923 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:33:27,923 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)

我們可以看到執行了2次查詢。說明並沒有產生緩存。說明和sqlsession調用的方法是有關係的

只有調用上圖中的方法才會產生一級緩存

一級緩存的銷毀

1.關閉session

這個是根據debug看到的一級緩存的最終結構。下面是整個依賴的類圖

test

 @Test
    public  void test() throws IOException, NoSuchFieldException, IllegalAccessException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity1);

        Field executorField = sqlSession.getClass().getDeclaredField("executor");
        executorField.setAccessible(true);
        CachingExecutor  cachingExecutor = (CachingExecutor) executorField.get(sqlSession);

        Field declaredField = cachingExecutor.getClass().getDeclaredField("delegate");
        declaredField.setAccessible(true);
        SimpleExecutor simpleExecutor  = (SimpleExecutor) declaredField.get(cachingExecutor);

        Field localCacheField = simpleExecutor.getClass().getSuperclass().getDeclaredField("localCache");
        localCacheField.setAccessible(true);
        PerpetualCache perpetualCache = (PerpetualCache) localCacheField.get(simpleExecutor);

        Field cacheField = perpetualCache.getClass().getDeclaredField("cache");
        cacheField.setAccessible(true);
        Map<Object,Object> map= (Map<Object, Object>) cacheField.get(perpetualCache);
        logger.info("緩存關閉前");
        for (Map.Entry<Object,Object> objectObjectEntry:map.entrySet()){
            logger.info(objectObjectEntry.getKey() + "===" + objectObjectEntry.getValue());
        }
        sqlSession.close();
        logger.info("緩存關閉后");

        for (Map.Entry<Object,Object> objectObjectEntry:map.entrySet()){
            logger.info(objectObjectEntry.getKey() + "=" + objectObjectEntry.getValue());
        }
    }

運行結果

2020-06-26 17:38:52,777 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:38:52,801 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:38:52,824 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:38:52,824 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:38:52,825 INFO [TempTest] - 緩存關閉前
2020-06-26 17:38:52,826 INFO [TempTest] - -1654591322:461730790:dao.Temp03Dao.getById:0:2147483647:select * from  temp where id = ?:1:dev===[TempEntity{id=1, value1='11111', value2='aaaaa'}]
2020-06-26 17:38:52,827 INFO [TempTest] - 緩存關閉后

可以看到session關閉后,緩存就不存在了

2.Commit提交

test

    @Test
    public  void testCommit() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity1);
        sqlSession.commit();
        TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity2);
        logger.info(tempEntity1 == tempEntity2);

    }

運行結果

2020-06-26 17:40:40,821 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:40:40,846 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:40:40,862 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:40:40,862 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:40:40,863 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:40:40,863 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:40:40,864 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:40:40,864 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:40:40,864 INFO [TempTest] - false

說明sqlSession.commit時會清空緩存

3.Rollback

test

    @Test
    public  void testRollback() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity1);
        sqlSession.rollback();
        TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity2);
        logger.info(tempEntity1 == tempEntity2);

    }

執行結果

2020-06-26 17:42:23,793 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:42:23,833 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:42:23,843 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:42:23,843 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:42:23,844 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:42:23,844 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:42:23,845 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:42:23,845 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:42:23,845 INFO [TempTest] - false

sqlSession.rollback()也會清空緩存

4.update更新

這裡是在第一次查詢后,緊接着進行update操作。這裏與表無關。就是操作其它表,也會清空緩存。

test

    @Test
    public  void testForUpdate() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity1);
        sqlSession.update("dao.Temp03Dao.updateById", 1);
        TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity2);
        logger.info(tempEntity1 == tempEntity2);

    }

運行結果

2020-06-26 17:45:43,997 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:45:44,034 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:45:44,048 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:45:44,049 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:45:44,049 DEBUG [dao.Temp03Dao.updateById] - ==>  Preparing: update temp set value1 = 'ffffff' where id = ? 
2020-06-26 17:45:44,049 DEBUG [dao.Temp03Dao.updateById] - ==> Parameters: 1(Integer)
2020-06-26 17:45:44,050 DEBUG [dao.Temp03Dao.updateById] - <==    Updates: 1
2020-06-26 17:45:44,051 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:45:44,051 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:45:44,052 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:45:44,053 INFO [TempTest] - TempEntity{id=1, value1='ffffff', value2='aaaaa'}
2020-06-26 17:45:44,053 INFO [TempTest] - false

這裏還是在一個session會話中。記得之前有人給我說只要在一個session會話中,執行update不會清空緩存。這裏的代碼就證明了

5.clearCache 主動清除

test

    @Test
    public  void testClearCatch() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity1);
        sqlSession.clearCache();
        TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1);
        logger.info(tempEntity2);
        logger.info(tempEntity1 == tempEntity2);

    }

運行結果

2020-06-26 17:48:42,085 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:48:42,110 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:48:42,124 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:48:42,124 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:48:42,125 DEBUG [dao.Temp03Dao.getById] - ==>  Preparing: select * from temp where id = ? 
2020-06-26 17:48:42,125 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)
2020-06-26 17:48:42,126 DEBUG [dao.Temp03Dao.getById] - <==      Total: 1
2020-06-26 17:48:42,126 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'}
2020-06-26 17:48:42,126 INFO [TempTest] - false

一級緩存 臟讀問題

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

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

高雄鼓勵換電動機車 最高補助額達 2.3 萬

高雄市機車總數達 201 萬輛,成為都市的污染源之一,為了鼓勵機車族更換電動機車,高雄市政府環保局推動補助政策,換車最高可獲得 2.3 萬元的補助。   高雄市政府環境保護局空噪科長鄭嵐 26 日下午表示,根據交通部機動車輛統計資料,高雄市截至 103 年 12 月底掛牌的使用中機車,總數約 201 萬輛,為鼓勵民眾汰舊換購電動車輛,高雄市環保局持續推動淘汰補助方案,除了經濟部工業局補助純購電動機車,機車族可獲得補助 7,200 元到 10,000 元外,若搭配汰舊二行程機車,再加碼補助至 17,400 元到 23,000 元。   他表示,同時,為了提升友善充電環境,高雄環保局近年來也積極推動充電站架設,除了原有公用及私有充電站,103 年完成社區大樓與電動機車經銷商等 25 座,共有充電站 217 站,讓高雄市騎乘電動車市民處處皆有電可充,建構低碳生活圈。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

※教你寫出一流的銷售文案?

中興攜手國家電網組合資公司 建成都無線汽車充電站

中興子公司中興新能源汽車與國家電網四川省電力公司達成協議,將在成都組建合資公司。此合資公司在傳統集中式充電模式的基礎上分佈式建設無線汽車充電站,第一批支援無線充電的社區巴士同日會在成都正式投入運營。   除社區巴士外,中興還將逐步推廣支持無線充電的大型公車專案,而房車的無線充電技術亦已成熟,用戶如有條件和需要,可對房車和停車廠進行改造,即可享有無線充電功能。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

新能源汽車入北京 改為備案制

在中國的全球新能源汽車大會上,北京市科委新能源與新材料處處長許心超透露,北京市新能源汽車準入方式有所調整,由先前的新能源汽車目錄方式改為備案方式,車型只要備案即可在北京銷售、上牌。   先前規定,按照《北京市示範應用新能源小客車生企業及品目錄》,北京市共有 7 款新能源汽車可在備案之後直接銷售、上牌。而這次許心超表示,按照中央的要求,準入方式也在改變,主要採取備案制,只要備案了就可銷售,政府則加強事後監管。
這意味著所有中國純電動汽車都可以進京銷售、上牌,享受財政補貼,而不再像以前必須要先進入嚴格的北京市新能源汽車目錄。   另一方面,為了讓純電動汽車的使用者迅速找到充電樁,相關部門也在進行改進,一是和百度合作,標注所有充電樁的電子地圖將很快上線;二是印製北京充電樁地圖;三是辦充電體驗周活動,在 2 月 2 日至 6 日,將分 2 次聯合所有北京的汽車企業,做充電實際體驗。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準

發展電動車 梅克爾盼德國2030年前設百萬充電站

摘錄自2019年11月3日中央通訊社德國報導

德國總理梅克爾4日將與本國汽車工業代表會商,討論如何加速發展低碳排的電池驅動交通工具。她3日透過影片表示,德國在2030年前應設置100萬座電動車充電站。

德國境內目前僅有約2萬座電動車公共充電站。梅克爾指出:「為達此(發展電動車)目的,我們想在2030年前設置100萬座充電站,而產業界將必須加入相關計畫。我們要談的就是這個。」

路透社報導,預定明天在總理府舉行的會議,將是為相關議題舉辦的第二場,涉及儘速採取行動,以期交通運輸產業為德國達成國家碳排減量目標做出貢獻。會議將聚焦於汽油和柴油的替代方案,其中包括氫燃料和電池,以及政府和業界如何分攤給予消費者的補助,以刺激相關產品買氣。

梅克爾表示,政府也將致力於保障就業機會。

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

※教你寫出一流的銷售文案?

巴西浮油事件3個月 污染擴至座頭鯨保育區

摘錄自2019年11月3日中央通訊社巴西報導

巴西東北巴伊亞州(Bahia)外海阿布羅略斯(Abrolhos)群島四周,有著巴西最豐富的海洋多樣性。群島中一座國家公園有著罕見珊瑚群、海鳥以及座頭鯨繁殖地。巴西海軍3日通報,困擾巴西海岸3個月的浮油污染已飄到座頭鯨保育區,嚴重污染生物多樣性豐富的群島地區,背後的環境及經濟破壞目前還無法量化。海軍在聲明中表示,海軍船艦清理的油污有部分在海洋中,有部分則在海灘上。

這些油污3個月前開始出現在巴西東北部外海,巴西著名2000公里海岸線上的200多個海灘都遭油漬污染。船員及志工已在海灘上清出數噸重的原油。巴西官員說,目前還無法量化油漬造成的環境及經濟破壞。

巴西政府2日點名一艘掛有希臘旗幟的油輪布普林納號(Bouboulina)是主要嫌疑犯,說這艘油輪當時從委內瑞拉載石油前往新加坡。巴西國家太空署(Inpe)2日表示,海中仍可能有油污在洋流推動下,南下至巴西東南的聖靈州(Espiritu Santo)及里約熱內盧州(Rio De Janeiro)。

清理污染的志工。照片來源: Kleber from Burgos / WWF-Brasil

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心