PowerMock學習(四)之Mock static的使用

我們編寫代碼的時候,總會寫一些工具類,為了方便調用喜歡使用static關鍵字來修飾對應方法。

那麼現在舉例說明,還是準備兩個接口,第一個是查詢學生總數,第二個是新增學生兩個接口,具體示例代碼如下:

package com.rongrong.powermock.mockstatic;

import com.rongrong.powermock.service.Student;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/23 8:08
 */
public class StudentStaticService {

    /**
     * 獲取學生總數
     * @return
     */
    public int getStudentTotal(){
        return StudentUtils.getStudent();
    }

    /**
     * 創建一個學生
     * @param student
     */
    public void createStudent(Student student){
        StudentUtils.createStudent(student);
    }
}

接着我們再來看看這個靜態工具類StudentUtils,具體代碼示例如下:

package com.rongrong.powermock.mockstatic;

import com.rongrong.powermock.service.Student;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/23 7:38
 */
public class StudentUtils {
    /**
     * 獲取學生總數
     * @return
     */
    public static int getStudent(){
        throw new UnsupportedOperationException();
    }

    /**
     * 創建一個學生
     * @param student
     */
    public static void createStudent(Student student){
        throw new UnsupportedOperationException();
    }
}

接下來我們用傳統方式,來做單元測試,示例代碼如下:

    @Test
    public void testGetStudnetTotal(){
        StudentStaticService staticService = new StudentStaticService();
        int studentTotal = staticService.getStudentTotal();
        assertEquals(studentTotal,10);
    }

    @Test
    public void testCreateStudent(){
        StudentStaticService staticService = new StudentStaticService();
        staticService.createStudent(new Student());
        assertTrue(true);
    }

接着運行下測試用例,結果肯定報錯了,為什麼報錯,這裏就不再細說了,參考之前文章,報錯,如下圖所示:

 

接下來我們使用powermock來進行測試,具體示例代碼如下:

 @Test
    public void testGetStudentWithMock(){
        //先mock工具類對象
        PowerMockito.mockStatic(StudentUtils.class);
        //模擬靜態類調用
        PowerMockito.when(StudentUtils.getStudent()).thenReturn(10);
        //構建service
        StudentStaticService service = new StudentStaticService();
        int studentTotal = service.getStudentTotal();
        assertEquals(10,studentTotal);
    }

    @Test
    public void testCreateStudentWithMock(){
        //先模擬靜態工具類
        PowerMockito.mockStatic(StudentUtils.class);
        //模擬調用
        PowerMockito.doNothing().when(StudentUtils.class);
        //構建service
        StudentStaticService service = new StudentStaticService();
        Student student = new Student();
        service.createStudent(student);
        //這裏用powermock來驗證,而不是mock,更體現了powermock的強大
        PowerMockito.verifyStatic();
    }

再次運行,測試通過,如下圖所示:

 

 

運行之前先讓powermock為我們準備了StudentUtils工具類,而且採用mockstatic的方法,最後我們用powermock.verifyStatic()驗證,而不是mock,更體現了powermock的強大。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

一看就懂的快速排序

概念

快速排序屬於交換排序,主要步驟是使用基準元素進行比較,把小於基準元素的移動到一邊,大於基準元素的移動到另一邊。從而把數組分成兩部分,然後再從這兩部分中選取出基準元素,重複上面的步驟。過程如下:

紫色:基準元素
綠色:大於基準元素
黃色:小於基準元素

這種思路叫做分治法。

基準元素

基準元素的選取可隨機選取。下面使用中我會使用第一位的元素作為基準元素。

排序過程

排序拆分過程如下圖:

紫色為基準元素,(每一輪都重新選取)
綠色為其他元素

第一輪

第二輪

第三輪

如上圖所示:
若元素個數為n,因為排序過程中需要和全部元素都比較一遍,所以時間複雜度為O(n),
而平均情況下排序輪次需要logn輪,因此快速排序的平均時間複雜度為O(nlogn)。

排序的實現方法

實現方法有雙邊循環法和單邊循環法

雙邊循環法

首選選取基準元素(pivot)4,並設置指針left和right,指向數組最左和最右兩個元素,如下:

第一次循環,先從right指針指向的數據(rightData)開始和基準元素比較
若 rightData >= pivot,則right指針向左移動,若 rightData < pivot,則right指針不移動,切換到left指針
left指針指向數據(leftData)與基準元素比較,若 leftData < pivot,則left指針向右移動,若 leftData > pivot,交換left和right指向的元素。

第一輪指針移動完后,得到如下結構:

然後 left和right指向的元素進行交換:

第一輪循環結束,重新切換到right指針,重複上述步驟。
第二輪循環后,得:

第三輪循環后,得:

第四輪循環后,得:

判斷到left和right指針指向同一個元素,指針停止移動,使pivot和指針元素進行交換,得:

宣告該輪循環結束,並根據Pivot元素切分為兩部分,這兩部分的數組再根據上述步驟進行操作。

實現代碼

public class DoubleSort {
    public static void quickSort(int[] arr, int startIndex, int endIndex) {

        //遞歸結束條件
        if (startIndex >= endIndex) {
            return;
        }

        // 基準元素位置
        int pivotIndex = partition(arr, startIndex, endIndex);

        // 根據基準元素,分成兩部分進行遞歸排序
        quickSort(arr, startIndex, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, endIndex);
    }

    public static int partition(int[] arr, int startIndex, int endIndex) {
        // 取第一個元素為基準元素,也可以隨機抽取
        int pivot = arr[startIndex];
        int left = startIndex;
        int right = endIndex;

        while (left != right) {
            // 控制right指針比較並左移
            while (left < right && arr[right] >= pivot) {
                right--;
            }

            // 控制left指針比較並右移
            while (left < right && arr[left] <= pivot) {
                left++;
            }

            // 交換left和right指針所指向的元素
            if (left < right) {
                int temp = arr[right];
                arr[right] = arr[left];
                arr[left] = temp;
            }
        }

        arr[startIndex] = arr[left];
        arr[left] = pivot;
        return left;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{4, 7, 6, 5, 3, 2, 8, 1};
        quickSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }
}

單邊循環法

雙邊循環法從數組的兩邊比較並交換元素,而單邊循環法則從數組的一邊遍歷,一直往後比較和交換,實現起來更加的簡單。
過程如下:

首先也是選取基準元素pivot(可以隨機選擇)
設置一個mark指針指向數組的起始位置,代表小於基準元素的區域邊界(不理解的就把它理解成是等會用來交換元素的就好了)

原始數組如下:

從基準元素下一位開始遍曆數組
如果該元素大於基準元素,繼續往下遍歷
如果該元素小於基準元素,mark指針往右移,因為小於基準元素的區域邊界增大了1(即小於基準元素的多了1位),所以mark就 +1,並且該元素和mark指向元素進行交換。

遍歷到元素3時,因為3 < 4,所以mark右移

然後交換元素

然後就繼續遍歷,根據上面的步驟進行判斷,後面的過程就不寫了。

實現代碼

public class SingleSort {
    public static void quickSort(int[] arr, int startIndex, int endIndex) {

        //遞歸結束條件
        if (startIndex >= endIndex) {
            return;
        }

        // 基準元素位置
        int pivotIndex = partition(arr, startIndex, endIndex);

        // 根據基準元素,分成兩部分進行遞歸排序
        quickSort(arr, startIndex, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, endIndex);
    }

    /**
     * 分治(單邊循環法)
     * @param arr
     * @param startIndex
     * @param endIndex
     * @return
     */
    public static int partition(int[] arr, int startIndex, int endIndex) {
        // 取第一個元素為基準元素,也可以隨機抽取
        int pivot = arr[startIndex];
        int mark = startIndex;

        for(int i = startIndex + 1; i< arr.length; i++) {
            if (pivot < arr[i]) {
                continue;
            }

            mark ++;
            int temp = arr[mark];
            arr[mark] = arr[i];
            arr[i] = temp;
        }
        arr[startIndex] = arr[mark];
        arr[mark] = pivot;
        return mark;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{4, 7, 6, 5, 3, 2, 8, 1};
        quickSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }
}

總結

本人也是初次接觸算法,慢慢的去理解算法的思路和實現過程后,真是為自己以往寫的算法感到羞愧。該文章也是為了加深自己對快排算法的印象,若文章有不足之處,懇請各位在下方留言補充。感謝各位的閱讀。Thanks(・ω・)ノ。

參考資料: 第四章。

個人博客網址: https://colablog.cn/

如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

電動車發展快速,旭化成增產鋰電池材料「分隔模」

 

日刊工業新聞23日報導,因車廠加快電動車(EV)的研發腳步、帶動電池材料市場成長速度超乎預期,故旭化成(Asahi Kasei)計畫上修鋰離子電池關鍵材料「分隔膜(separator)」的增產計畫,目標在2020年結束前將分隔膜年產能最高擴增至15億平方公尺(m2)、將達現行的2.5倍,且將遠高於原先規劃的11億m2目標,期望藉由積極投資、鞏固全球龍頭位置。預估追加擴產所需的投資額約300億日圓。

據報導,2016年全球分隔膜市場規模約15億m2、且預估2020年最高將擴大至35億m2的水準。就用途別來看,車用需求佔整體比重7成;就國別來看,因強化環保規範、提振EV需求急增的中國為全球最大市場、佔全球比重過半。

旭化成於3月30日宣布,因電動車(EV)、油電混合車(HV)等車用鋰離子電池需求預估將呈現急速增長,故決議擴增鋰離子電池關鍵材料「分隔膜」產能,計畫投下約150億日圓,在守山製造所(滋賀縣守山市)增設年產能約2億平方公尺(m2)的分隔膜產線,並預計於2019年度上半年商轉。

旭化成指出,待上述增產工程完工後,該公司整體分隔膜年產能將從現行的約6.6億m2提高3成至約8.6億m2。

旭化成為全球分隔膜龍頭廠、全球市佔率達5成,目前於滋賀縣、宮崎縣以及美國和南韓生產分隔膜。

根據日本市調機構富士經濟(Fuji Keizai)預估,2020年全球分隔膜市場規模將增至3,000億日圓、將達2015年的2倍水準,而EV、HV等車用用途是推動分隔膜需求急增的最大功臣,預估2020年車用分隔膜佔整體市場比重將達約45%。

富士經濟6月22日公布調查報告指出,預估2030年時EV年銷售量將增至407萬台、超越HV(2030年銷售量預估為391萬台),且之後雙方的差距將持續擴大。富士經濟預估,在中國需求增加加持下,2035年EV全球銷售量將擴大至630萬台、將達2016年的13.4倍(較2016年增加12.4倍)。

(本文內容由授權使用。圖片出處:)  

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

科斯創供電動車固化劑 參加澳洲太陽能汽車挑戰賽

如何讓未來交通盡可能的實現永續發展?一群來自德國亞琛工業大學和亞琛應用技術大學,高度積極的大學生提出這樣一個問題。為了尋找答案,他們全心全意地投入一項偉大的專案中:開發一輛太陽能汽車,參加被譽為全球最艱難的太陽能汽車賽事─「世界太陽能汽車挑戰賽」,該賽事將於今年10月8日-15日在澳洲舉行。為了實現這一想法,大約45名青年研究人員在教授們的大力支持下成立「亞琛太陽能戰車」 (Sonnenwagen Aachen)協會。

作為全球領先的創新和永續性材料解決方案供應商,科思創與學生們一樣對此充滿熱情,並希望與他們共同跨越極限,促使專案圓滿完成。 科思創已與德國亞琛工業大學建立了長期合作關係,並作為材料和技術服務提供者與金牌贊助商,為「太陽能戰車」提供支援。 日前,雙方就該專案簽署了合作協定。

太陽能汽車合作

「永續發展是我們策略的一部分,我們支援這一野心勃勃的專案,年輕的研究者們也希望借此機會證明眾多創新和永續交通的概念如今已經可以實現。」 科思創負責創新的董事會成員兼營運長施樂文博士(Dr. Markus Steilemann)說,「在氣候保護和節約化石燃料方面,太陽能汽車貢獻顯著。 隨著我們的技術發展以及合作關係的深化,我們希望彰顯科思創致力於創新和永續發展的承諾,以及對青年才俊的強力支持。」

「太陽能戰車」團隊第一主席Hendrik Löbberding對科思創表示歡迎:「我們很高興可以得到科思創的鼎力相助,最重要的是,科思創在材料方面的強大實力將使我們受益匪淺。」總部位於利物庫森的科思創,在將創新材料應用到太陽能交通方面已累積了豐富的經驗:作為「陽光動力號」太陽能飛機專案的官方合作夥伴,科思創為全球首次完全依靠太陽能的載人環球飛行做出了重大貢獻。

賽道測試:含生物基固化劑的汽車塗料

該澳洲賽事所經路線在10月的氣溫可高達攝氏45度,紫外線輻射強,空氣含塵量高。科思創希望藉「太陽能戰車」專案,在嚴酷氣候條件下對各種材料進行測試。其中最重要的產品應用是由全球領先的汽車塗料製造商PPG提供的三塗層聚氨酯塗料,該塗料尤其適用於由碳纖維複合材料製成的汽車車身部件。

氣候條件對面漆會產生顯著影響。該PPG面漆採用科思創生產的生物基固化劑Desmodur® eco N 7300,該固化劑中70%的碳含量來自於生物基。

此外,科思創生產的聚氨酯和聚碳酸酯材料也應用於「太陽能戰車」,幫助實現輕量化和空氣動力學的設計概念。

對太陽能汽車的嚴峻考驗

被譽為全球最艱難的太陽能汽車賽事─「世界太陽能汽車挑戰賽」,今年將迎向第30周年。每兩年,來自全球各地的團隊會駕駛各自製造的汽車,在不使用一滴燃油的條件下,在達爾文至阿德萊德的3000公里道路上展開競賽。

來自亞琛的「太陽能戰車」將是今年挑戰賽「挑戰者組」中唯一參賽的德國汽車。團隊對於贏得比賽非常樂觀,來自「亞琛太陽能戰車」的Hendrik Löbberding表示:「我們在零排放汽車領域擁有豐富的經驗,而且裝備精良,期待與來自五大洲的其他約40個團隊一決高下。」

兩名團隊成員曾駕駛電動汽車贏得為期四天、橫穿北萊茵-威斯特伐利亞的e-CROSS Germany 「氣候中和」汽車拉力賽。 在那之前一個月,「太陽能戰車」成員還陪同一支來自波鴻的團隊參加了2016年European Solar Challenge 24小時太陽能汽車挑戰賽。

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

精通awk系列(8):awk劃分字段的3種方式

回到:

詳細分析awk字段分割

awk讀取每一條記錄之後,會將其賦值給$0,同時還會對這條記錄按照預定義變量FS劃分字段,將劃分好的各個字段分別賦值給$1 $2 $3 $4...$N,同時將劃分的字段數量賦值給預定義變量NF

引用字段的方式

$N引用字段:

  • N=0:即$0,引用記錄本身
  • 0<N<=NF:引用對應字段
  • N>NF:表示引用不存在的字段,返回空字符串
  • N<0:報錯

可使用變量或計算的方式指定要獲取的字段序號。

awk '{n = 5;print $n}' a.txt
awk '{print $(2+2)}' a.txt   # 括號必不可少,用於改變優先級
awk '{print $(NF-3)}' a.txt

分割字段的方式

讀取record之後,將使用預定義變量FS、FIELDWIDTHS或FPAT中的一種來分割字段。分割完成之後,再進入main代碼段(所以,在main中設置FS對本次已經讀取的record是沒有影響的,但會影響下次讀取)。

劃分字段方式(一):FS或-F

FS或者-F:字段分隔符

  • FS為單個字符時,該字符即為字段分隔符
  • FS為多個字符時,則採用正則表達式模式作為字段分隔符
  • 特殊的,也是FS默認的情況,FS為單個空格時,將以連續的空白(空格、製表符、換行符)作為字段分隔符
  • 特殊的,FS為空字符串””時,將對每個字符都進行分隔,即每個字符都作為一個字段
  • 設置預定義變量IGNORECASE為非零值,正則匹配時表示忽略大小寫(隻影響正則,所以FS為單字時無影響)
  • 如果record中無法找到FS指定的分隔符(例如將FS設置為”\n”),則整個記錄作為一個字段,即$1$0相等
# 字段分隔符指定為單個字符
awk -F":" '{print $1}' /etc/passwd
awk 'BEGIN{FS=":"}{print $1}' /etc/passwd

# 字段分隔符指定為正則表達式
awk 'BEGIN{FS=" +|@"}{print $1,$2,$3,$4,$5,$6}' a.txt

劃分字段方式(二):FIELDWIDTHS

指定預定義變量FIELDWIDTHS按字符寬度分割字段,這是gawk提供的高級功能。在處理某字段缺失時非常好用。

用法:

示例1:

# 沒取完的字符串DDD被丟棄,且NF=3
$ awk 'BEGIN{FIELDWIDTHS="2 3 2"}{print $1,$2,$3,$4}' <<<"AABBBCCDDDD"
AA BBB CC 

# 字符串不夠長度時無視
$ awk 'BEGIN{FIELDWIDTHS="2 3 2 100"}{print $1,$2,$3,$4"-"}' <<<"AABBBCCDDDD"
AA BBB CC DDDD-

# *號取剩餘所有,NF=3
$ awk 'BEGIN{FIELDWIDTHS="2 3 *"}{print $1,$2,$3}' <<<"AABBBCCDDDD"      
AA BBB CCDDDD

# 字段數多了,則取完字符串即可,NF=2
$ awk 'BEGIN{FIELDWIDTHS="2 30 *"}{print $1,$2,NF}' <<<"AABBBCCDDDD"  
AA BBBCCDDDD 2

示例2:處理某些字段缺失的數據。

如果按照常規的FS進行字段分割,則對於缺失字段的行和沒有缺失字段的行很難統一處理,但使用FIELDWIDTHS則非常方便。

假設a.txt文本內容如下:

ID  name    gender  age  email          phone
1   Bob     male    28   abc@qq.com     18023394012
2   Alice   female  24   def@gmail.com  18084925203
3   Tony    male    21   aaa@163.com    17048792503
4   Kevin   male    21   bbb@189.com    17023929033
5   Alex    male    18                  18185904230
6   Andy    female  22   ddd@139.com    18923902352
7   Jerry   female  25   exdsa@189.com  18785234906
8   Peter   male    20   bax@qq.com     17729348758
9   Steven  female  23   bc@sohu.com    15947893212
10  Bruce   female  27   bcbd@139.com   13942943905

因為email字段有的是空字段,所以直接用FS劃分字段不便處理。可使用FIELDWIDTHS。

# 字段1:4字符
# 字段2:8字符
# 字段3:8字符
# 字段4:2字符
# 字段5:先跳過3字符,再讀13字符,該字段13字符
# 字段6:先跳過2字符,再讀11字符,該字段11字符
awk '
BEGIN{FIELDWIDTHS="4 8 8 2 3:13 2:11"}
NR>1{
    print "<"$1">","<"$2">","<"$3">","<"$4">","<"$5">","<"$6">"
}' a.txt

# 如果email為空,則輸出它
awk '
BEGIN{FIELDWIDTHS="4 8 8 2 3:13 2:11"}
NR>1{
    if($5 ~ /^ +$/){print $0}
}' a.txt

劃分字段方式(三):FPAT

FS是指定字段分隔符,來取得除分隔符外的部分作為字段。

FPAT是取得匹配的字符部分作為字段。它是gawk提供的一個高級功能。

FPAT根據指定的正則來全局匹配record,然後將所有匹配成功的部分組成$1、$2...,不會修改$0

  • awk 'BEGIN{FPAT="[0-9]+"}{print $3"-"}' a.txt
  • 之後再設置FS或FPAT,該變量將失效

FPAT常用於字段中包含了字段分隔符的場景。例如,CSV文件中的一行數據如下:

Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA

其中逗號分隔每個字段,但雙引號包圍的是一個字段整體,即使其中有逗號。

這時使用FPAT來劃分各字段比使用FS要方便的多。

echo 'Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA' |\
awk '
    BEGIN{FPAT="[^,]*|(\"[^\"]*\")"}
    {
        for (i=1;i<NF;i++){
            print "<"$i">"
        }
    }
'

最後,patsplit()函數和FPAT的功能一樣。

檢查字段劃分的方式

有FS、FIELDWIDTHS、FPAT三種獲取字段的方式,可使用PROCINFO數組來確定本次使用何種方式獲得字段。

PROCINFO是一個數組,記錄了awk進程工作時的狀態信息。

如果:

  • PROCINFO["FS"]=="FS",表示使用FS分割獲取字段
  • PROCINFO["FPAT"]=="FPAT",表示使用FPAT匹配獲取字段
  • PROCINFO["FIELDWIDTHS"]=="FIELDWIDTHS",表示使用FIELDWIDTHS分割獲取字段

例如:

if(PROCINFO["FS"]=="FS"){
    ...FS spliting...
} else if(PROCINFO["FPAT"]=="FPAT"){
    ...FPAT spliting...
} else if(PROCINFO["FIELDWIDTHS"]=="FIELDWIDTHS"){
    ...FIELDWIDTHS spliting...
}

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

【故障公告】數據庫服務器 CPU 近 100% 引發的故障(源於 .NET Core 3.0 的一個 bug),雲計算之路-阿里雲上:數據庫連接數過萬的真相,從阿里雲RDS到微軟.NET Core

非常抱歉,這次故障給您帶來麻煩了,請您諒解。

今天早上 10:54 左右,我們所使用的數據庫服務(阿里雲 RDS 實例 SQL Server 2016 標準版)CPU 突然飆升至 90% 以上,應用日誌中出現大量數據庫查詢超時的錯誤。

Microsoft.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
 ---> System.ComponentModel.Win32Exception (258): Unknown error 258

我們收到告警通知並確認問題后,在 11:06 啟動了阿里雲 RDS 的主備切換, 11:08 完成切換,數據庫 CPU 恢復正常。但是關鍵時候 docker swarm 總是雪上加霜,在數據庫恢復正常后,部署博客站點的 docker swarm 集群有一個節點出現異常情況,部分請求會出現 50x 錯誤,將這個異常節點退出集群並啟動新的節點后在 11:15 左右才恢復正常。

通過阿里雲 RDS 控制台的 CloudDBA 發現了 CPU 近 100% 期間執行次數異常多的 SQL 語句。

SELECT TOP @__p_1 [b].[TagName] AS [Name], [b].[TagID] AS [Id], [b].[UseCount], [b].[BlogId]
FROM [blog_Tag] [b]
WHERE [b].[BlogId] = @__blogId_0
    AND @__blogId_0 IS NOT NULL
    AND [b].[UseCount] > ?
ORDER BY [b].[UseCount] DESC

上面的 SQL 語句是 EF Core 3.0 生成的,其中加粗的  IS NOT NULL  就是 EF Core 3.0 的一個臭名還沒昭著的 bug —— 生成 SQL 語句時會生成額外的  IS NOT NULL  查詢條件。

誰也沒想到(連微軟自己也沒想到)這個看似無傷大雅的多此一舉卻存在致命隱患 —— 在某些情況下會讓整個數據庫服務器 CPU 持續 100% (或者近 100%)。一開始遇到這個問題時,我們也沒想到,還因此錯怪了阿里雲(),後來在阿里雲數據庫專家分析了我們遇到的問題后才發現原來罪魁禍首是 EF Core 生成的多餘的 “IS NOT NULL” ,它會在某些情況下會造成 SQL Server 緩存了性能極其低下(很耗CPU)的執行計劃,然後後續的查詢都走這個執行計劃,CPU 就會居高不下。這個錯誤的執行計劃有雙重殺傷力,一邊巨耗數據庫 CPU ,一邊造成對應的查詢無法正常完成從而查詢結果不能被緩存到 memcached ,於是針對這個執行計劃的查詢就越多,雪崩效應就發生了。唯一的解決方法就是清除這個錯誤的執行計劃緩存,主備切換或者重啟服務器只是清除執行計劃緩存的一種簡單粗暴的方法。

在我們開始遇到這個問題,就已經有人在 github 上了這個問題:

Yeah this needs to be fixed asap. We just deployed code that uses 3.0 and had to immediately revert to 2.2 because simple queries blew up our SQL Azure CPU usage. Went from under 50% to 100% and stayed there until we rolled back.

但當時沒有引起微軟的足夠重視,在我們知道錯怪了阿里雲實際是微軟的問題之後,我們向微軟 .NET 團隊反饋了這個問題,這次得到了微軟的重視,很快就修復了,但是是通過 .NET Core 3.0 Preview 版發布的,我們在非生產環境下驗證了  IS NOT NULL 的確修復了,由於是 Preview 版,再加上 .NET Core 3.1 正式版年底前會發布,所以我們沒有在生產環境中更新這個修復,只是將上次出現問題的複雜 SQL 語句改為用 Dapper 調用存儲過程。後來阿里雲數據庫專家進一步對我們的數據庫進行分析,連平時數據庫 CPU 的毛刺(偶爾跑高的波動)都與  IS NOT NULL  有關。

這就是這次故障的背景,在我們等待 .NET Core 3.1 正式版修復這個 bug 的過程中又被坑了一次,與上次不同的是這次出現問題的 SQL 語句非常簡單,而且只有一個 “IS NOT NULL” ,由此可見這個坑的殺傷力。

這個坑足以載入 .NET Core 的史冊,另一個讓我們記憶猶新的那次也讓我們錯怪阿里雲的 .NET Core 坑是正式版的 .NET Core 中 SqlClient 竟然漏寫了 Dispose ,詳見 。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

二代電動車電池問世!韓廠急追、想搶Panasonic市佔

目前電動車電池的前三大廠分別是Panasonic、LG Chem、Samsung SDI,今年三家業者相繼推出第二代電池,將引爆新一波市場大戰。

韓媒etnews 7日報導,特斯拉平價電動車「Model 3」將在本月發布,預料全數採用日廠Panasonic的二代圓柱狀電池—「Panasonic 21700」。據稱Panasonic二代電池容量為4,500mA。

與此同時,外傳韓廠LG Chem和Samsung SDI的二代圓柱電池預定今年底量產,電池容量略高於Panasonic。報導稱,LG Chem新電池電力在4,700~4900mA之間,Samsung SDI則為4,500mA。

二代電池性能較一代大為提升,倘若電動車原本需要1千組一代電池才能應付所需,到了二代電池只需700組就足夠。消息指出,新崛起的電動車廠Lucid Motors和Faraday Future將採二代電池,正與LG Chem和Samsung SDI商討供應事宜。另外,歐洲大型車廠也考慮不再分散訂單,韓廠有望搶下更多訂單。

(本文內容由授權使用)

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

中國電池行業發展全球領先,亞太電池展海外佈局加速

羅蘭貝格汽車行業中心與德國著名汽車研究機構亞琛汽車工程技術有限公司共同發佈的《2017年第一季度全球電動汽車發展指數》報告(以下簡稱“報告”),對全球七大主要汽車國家電動汽車競爭格局在技術、行業、市場三項指標上進行了詳細分析。

 

就“行業”指標而言,中國已經確立了領先地位,原因在於中國市場持續快速增長,且超過90%的鋰電池都在本土生產。與中國相比,日本在電動汽車產量和全球電池生產份額這兩方面都處於不利地位,排名滑落至全球第三。美國則攀升至第二位。

 

從全球電池生產份額來看,中國電池製造商已經處於領先地位。由此可見,在電池製造領域,中國的優勢日益明顯。許多國際企業負責人紛紛表示看好未來中國電池市場,希望借助展會這一平臺進入中國市場,在中國千億元級電池市場中“分一杯羹”。作為全球領先的電池採購交易平臺,亞太電池展吸引了大批國際企業前來參展,目前已有大量海外優質採購商分別通過網站後臺、郵件、社交平臺等進行了參觀登記。

 

 

除此之外,主辦方還收到了德國汽車協會、美國能源協會、美國汽車零部件協會、巴基斯坦汽車零部件協會(54人觀展團)、印度觀展團(50余人觀展團)等重量級觀展團參觀申請。國際優質採購商的參與有利於幫助國內參展企業拓展海外消費市場,助推我國電池產業的可持續發展,做大做強國內品牌。相信在亞太電池展這一全球領先的電池與儲能行業採購交易平臺的支援下,中國電池與儲能行業國際化的步伐將繼續提速,在全球範圍內掀起“動力風暴”。

 

作為世界級的動力電池與儲能行業交易盛會,亞太電池展自全面啟動以來,得到了國內外主流媒體的高度關注,多家行業媒體進行宣傳報導,迅速建立起亞太電池展在國際的品牌知名度、美譽度,有效對接目標客戶及潛在買家,也有效幫助國內參展商在全球範圍的品牌傳播。

專業協會鼎力支持

 

TURKEY ELECTRIC & HYBRID VEHICLES ASSOCIATION是國際能源機構(IEA)框架下的一個國際成員組織,致力於混合動力和燃料電池汽車的資訊傳播,通過banner、新聞等報導方式使亞太電池展的宣傳效果如虎添翼。

 

有理由相信,亞太電池展很快將給業界帶來一場電池與儲能產業的航母級盛宴。作為立志於打造國際頂級電池行業採購易與技術交流平臺的亞太電池展,組委會將繼續增大海外買家邀約力度,後期將著重歐美、俄羅斯、中東、中亞以及東南亞等地區優質買家團的組織,以切實説明到國內企業拓展國際市場。

 

 

 

 

想查詢更多展會訊息,請登陸大會官網:http://www.battery-expo.com/ 瞭解。

 

預訂展位:+86-20-32373488

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

上海新能源汽車展8月23舉行 氫燃料電池汽車成亮點

 目前,未來汽車的三大發展方向包括:新能源汽車、自動駕駛汽車和飛行汽車。飛行汽車估計在我們這代人的時間裡是實現不了了,但是新能源汽車及自動駕駛汽車卻是觸手可及,是當前最熱門的一個話題。

 

氫燃料電池開始被重視

新能源汽車之間的競爭,其實主要在純電動汽車和混合動力汽車之間展開,而被稱為傳統汽車“完美替代者”的氫燃料汽車,一直以來都顯得特別低調。直到今年,氫燃料電池動力汽車終於重新進入人們的視野。

 

“十三五”規劃中明確提到:“要推進燃料電池汽車產業化”;前不久科技部部長萬鋼表示:“在未來車用能源中,氫燃料與電力將並存互補,共同支撐新能源汽車產業發展”。國外方面:英國政府4月份宣佈將投入2300萬英鎊來完善氫燃料電池汽車的基礎設施;5月,日本11家企業簽署諒解備忘錄,計畫在日本共建加氫站,推進日本政府此前發佈的《氫能與燃料電池戰略路線圖》。

 

 氫能具有高效率、來源豐富、用途廣泛的優勢,可以在3分鐘-5分鐘內給電池灌滿燃料,被視為是“未來能源”。與傳統動力汽車及純電動車相比,氫燃料電池汽車動力更可持續,能效更高,續航能力更強,且可實現零碳排放,被國際公認為“終極新能源汽車解決方案”。

 

除了“十三五”規劃中提到2020年實現燃料電池車批量生產和規模化示範應用外,在新一輪的新能源汽車補貼政策中,儘管純電動和插電式混合動力的補貼有所下降,但是氫燃料電池的補貼方案並沒有調整,依然延續至2020年不退坡的政策。

 

氫燃料汽車異軍突起

目前宇通、福田、中植、五洲龍等大型車企均有技術儲備,並開發出了成品車型。6月16-18日,在2017深圳國際新能源汽車產業博覽會上,五洲龍全球首發了“F1未來”(Future)系列8.5米氫燃料電池通勤車。該車採用了30KW氫燃料電池系統+磷酸鐵鋰電池(功率型)的混合動力技術路線,一次加氫只需5分鐘,可以續航430KM,成為了展會上的一大熱點。

 

 

另外,工信部發佈的《新能源汽車推薦車型目錄》中也不乏氫燃料電池車型的身影。無論是國家的政策還是車企的動作,種種跡象都表明,氫燃料汽車即將迎來發展的高潮。目前國內已有14家企業正緊鑼密鼓的斥鉅資佈局燃料電池車領域。近期,就連東旭光電這樣的玻璃基板廠商也斥資1億元參股億華通,積極佈局氫燃料電池業務,足見行業風口之大。

 

由充電設施線上網、廣東省充電設施協會、廣東省新能源汽車產業協會和振威展覽股份共同主辦,中國土木工程學會城市公共交通學會協辦的2017上海國際新能源汽車產業博覽會將於8月23-25日在上海新國際博覽中心舉行,多家氫燃料電池企業和氫燃料汽車企業將亮相,將有力推動氫燃料電池汽車的市場化應用。

 

此外,比亞迪、申龍客車、珠海銀隆、上汽集團、上饒客車、中植新能源、中通、江淮、吉利、眾泰、知豆、南京金龍、成功汽車、新吉奧集團、瑞馳新能源、福汽新龍馬等新能源汽車企業,以及精進電動、英威騰、東風電機、力神、沃特瑪、國軒高科、地上鐵、特來電、科陸、巴斯巴、萬馬專纜、奧美格、瑞可達等核心三電及零部件知名企業將亮相本次展會,展出最新款產品和前沿技術。

 

前有“三元鋰電”跟“磷酸鐵鋰”的技術路線之爭,現有純電動汽車與氫燃料電池汽車市場前景的博弈。本次展會的舉辦對於新能源汽車純電動和燃料電池動力產品具有積極的展示作用。促進各界人士對純電動及燃料電池動力產品的認識及瞭解。

 

參觀預登記,請點擊:

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

EV弱點一次解決!豐田傳推全固體電池車、數分鐘充飽電

東京新聞25日報導,豐田汽車(Toyota)計畫在2022年於日本國內開賣新型電動車(EV),其電池將採用充電量可達鋰離子電池2倍的「全固體電池」,將大幅提升EV的續航距離,且僅需數分鐘時間就可充飽電。在EV的研發上,由歐美廠商跑在前頭,而豐田期望藉由導入革新性技術扳回劣勢。

報導指出,現行市售的EV所搭載的電池以鋰離子電池為主,不過其弱點在於充飽一次電所能行駛的距離約300-400km、遜於汽油車,且即便使用快速充電技術、也需花費數十分鐘才能充飽電,而採用全固體電池的話,就有望一口氣將上述弱點全數解決。

據報導,全固體電池是將電解質從液體變更為固體,而豐田長年來持續進行全固體電池的研發,並於去年宣佈已攜手東京工業大學成功發現可適用於電解質的固體材料,並將在今年開始進行量產研發。

德國BMW、福斯(Volkswagen)等車廠也正研發全固體電池,不過量產相關計畫仍未明。

日經新聞曾於2011年10月報導,豐田汽車已和東京工業大學及高能源加速器研究機構攜手研發出一款使用新化合物的次世代電動車(EV)用「全固體電池」,其充飽一次電所能行駛的距離最長有望達1,000km左右的水準。

富士經濟6月22日公布調查報告指出,預估2030年時EV年銷售量將增至407萬台、超越油電混合車(HV、2030年銷售量預估為391萬台),且之後雙方的差距將持續擴大。富士經濟預估,在中國需求增加加持下,2035年EV全球銷售量將擴大至630萬台、將達2016年的13.4倍(較2016年增加12.4倍)。

(本文內容由授權使用。圖片出處:Toyota)

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選