「每日五分鐘,玩轉 JVM」:GC 概覽

前言

GC(Garbage Collection)是我們在學習 JVM 的過程中不可避免的一道坎,接下來,我們就來系統的學習一下 GC。

做一件事情之前,我們一定要去知道我們為什麼要去做,這裏不僅僅指 GC,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。

下面我們先去了解為什麼要有 GC,以及 GC 在 JVM 中扮演了一個什麼樣的角色,起到了什麼的作用?

為什麼要有 GC

用過 C++ 的同學可能知道,對象所佔的內存在程序結束運行之前一直被佔用,在明確釋放之前不能分配給其它對象。如果我們不去手動的清除這些無用的對象,內存很快就被佔滿,而在 JVM 中,GC 所起到的作用就是一個清道夫,它可以幫助我們去判定哪些對象是無用對象怎麼進行垃圾收集,以及決定內存分代和內存分配的策略**。

可能有同學會問了,既然我們的 JVM 會給我們做 GC 的工作,我們為什麼還要去學習 GC 呢,一切交給 JVM 不好嗎?當然,在我們的日常情況下,我們一般不會去關心 GC 的一些細節,但是當我們遇到內存泄露,內存溢出,高併發瓶頸的時候,我們就需要去對 GC 開刀,進行更為細緻的監控和調節。

內存泄露:指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果。

內存溢出:應用系統中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於能提供的最大內存。

那麼現在問題來了,我們要進行垃圾回收,首先我們需要知道垃圾在哪

垃圾在哪

前面我們講了JVM 的運行時內存區域,知道線程可以分為線程獨佔區和線程共享區,其中線程獨佔區(程序計數器,虛擬機棧,本地方法棧)的內存生命周期是和線程保持一致,且這幾個區域分配的內存大小跟類的大小有關,也就是說,當我們的類結構固定之後,這部分的內存就不會再發生更改,且當方法或線程結束的時候,內存自然就跟隨着回收了.

而線程共享區的堆內存和方法區則不一樣,堆內存和方法區所用的內存是在編譯期間無法確定的,因為一個接口的不同實現,一個方法的不同控制條件分支所執行的代碼可能完全相反,我們只有在運行時才知道會創建哪些對象,這部分的內存的分配和回收是動態的,而我們的 GC 關注的就是該部分的內存。

打個比方來說:JVM 如果是一輛車,線程獨佔區的就像是零件,在出廠時這些零件的壽命基本上都是已知的,線程共享區就像是汽油,汽油的消耗跟我們所採用的路線有關,所以我們關注的部分就是這部分會動態變化的,比如如何開車才能更省油~

知道了垃圾在什麼位置會出現,我們下一步就需要去判定在這些區域的有哪些是垃圾~

下節預告

本節內容到這裏先告一段落,下一節我們來學習,怎麼去判定是否為垃圾~

公眾號

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

【其他文章推薦】

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

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

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

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

澳洲熱浪恐惡化野火危機 數千觀光客準備撤離

摘錄自2020年1月2日中央社雪梨報導

澳洲4日恐遭一波熱浪侵襲,預期會引發致命火災,數千名觀光客必須在不到48小時內撤離已被野火肆虐的沿海社區。

法新社報導,在2019年到2020年的跨年夜,災難性野火把澳洲大陸南岸燒出遍地火場,沿著海岸形成一條火帶,造成至少8人死亡,海邊小鎮被火焰包圍,度假遊客陷入困境。

澳洲新南威爾斯省(NSW)鄉村消防局公告「遊客禁停區」,從度假勝地巴特曼灣(Batemans Bay)沿著向來風景優美的東南海岸延伸約200公里,到相鄰的維多利亞省(Victoria),當局也呼籲這裡的人遠離火災威脅的地區。

當局告誡遊客在4日前離開,天氣預報預測這天會有狂風,氣溫將飆升到攝氏40度以上。

新南威爾斯省運輸部長康史坦士(Andrew Constance)接受澳洲廣播公司(ABC)訪問時說,這可能是這個地區「歷來最大規模的人員撤離」,數千人準備疏散,以避開4日可能的新一波惡火。

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

【其他文章推薦】

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

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

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

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

次世代倫敦經典!紅色雙層公車改採比亞迪電動車系統

提到英國倫敦,不少人就會想起經典的紅色雙層公車。倫敦交通局為響應環保,宣布與比亞迪簽約,將部分紅色雙層公車打造為搭載電池的次世代電動公車,且即將開始在倫敦市展開服務。

在英國舉辦的第40屆清潔巴士高峰會(Clean Bus Summit)上,倫敦交通局與比亞迪聯合宣布了這項消息。倫敦市場Boris Johnson指出:「過去不少人都認為雙層公車因所需的電池體積問題而無法電動化,但比亞迪辦到了,領先全球。」從今年十月開始,比亞迪所生產的紅色雙層巴士將成為倫敦第16路公車所採用的車種。

比亞迪歐洲營運經理Isbrand Ho傳達公司與倫敦交通局的愉快合作,且表示希望還能把無汙染的電動公車推廣到更多國家、城市。比亞迪電動公車採用許多領先技術,包含12年保固的碳酸鋰鐵電池技術、專利的內輪引擎、反饋制動系統等。比亞迪電動公車具有壽命較長、環保無汙染、安靜、平穩等優點,每次充電後可在市區內行駛約155英里。

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

【其他文章推薦】

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

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

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

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

數據結構之Array、ArrayList、List、LinkedList對比分析

一、前言:

  在c#數據結構中,集合的應用非常廣泛,無論是做BS架構還是CS架構開發,都離不開集合的使用,比如我們常見的集合包括:Array、ArrayList、List、LinkedList等。這一些數據集合,在功能上都能夠實現集合的存取,但是他們內部有什麼區別,在使用時需要注意一些什麼呢?下面根據個人的經驗,對這一些集合數據的使用做一個簡單的小結,如果說的不對的地方,歡迎指出,多多交流改進。

二、Array集合簡介

  Array集合,也就是數組,是最簡單的數據結構,其存儲的數據在內存空間是連續的,數組有一下一些特點

  • 1.數據存儲是連續的
  • 2.數組長度在定義時就必須制定
  • 3.數組存儲的數據類型都是同一類型
  • 4.數組可以直接通過小標訪問

  優缺點:
   優點:
  1、可以根據索引直接訪問,訪問速度快
   2、數據是安全的,由於數據類型一致性,在存儲使用過程中不涉及
  缺點:
  1、由於數據是連續存儲的,導致插入效率變慢
    2、由於數組長度大小固定,那麼對預期非固定長度的数字不好處理

  練習實例代碼:

 

    /// <summary>
    /// 數組練習操作 
    /// </summary>
    public class ArrayTest
    {
        /// 數組 Array 對於大家來說一點都不陌生
        /// 數組是在內存連續分配的存儲空間,這也導致數組有一下一些特點
        /// 1.數據存儲是連續的
        /// 2.數組長度在定義時就必須制定
        /// 3.數組存儲的數據類型都是同一類型
        /// 4.數組可以直接通過小標訪問
        /// 
        /// 優缺點:
        /// 優點:
        ///     1、可以根據索引直接訪問,訪問速度快
        ///     2、數據是安全的,由於數據類型一致性,在存儲使用過程中不涉及到裝箱拆箱操作
        /// 缺點:
        ///     1、由於數據是連續存儲的,導致插入效率變慢
        ///     2、由於數組長度大小固定,那麼對預期非固定長度的数字不好處理

        /// int類型的數組操作 
        public static void IntArrayTest()
        {

            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類
            st.Start();//開始計時

            Console.WriteLine("開始初始化長度為10000000的int數組:");

            //// 定義一個數組
            int[] nums = new int[10000000];
            for (int i = 0; i < 10000000; i++)
            {
                nums[i] = 1 + 1;
            }

            //需要統計時間的代碼段

            st.Stop();//終止計時
            Console.WriteLine(string.Format("初始化長度為10000的int數組完畢!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

三、ArrayList集合簡介

ArrayList 是Array的升級版,能夠解決Array的一些缺點
ArrayList其內部實現也是Array,只是其長度是可以動態,在其內部用一個變量記錄控制長度,ArrayList有如下一些特點

  • 1.長度不固定
  • 2.可以存儲不同的數據類型(object)
  • 3.同樣支持索引查詢(可以直接通過小標訪問)
  • 4.靈活性更強,以犧牲性能為代價

優缺點:
優點:
1、長度不固定,在定義是不必擔長度溢出
2、可以存儲任意數據類型
3、可根據索引查詢,查詢效率快
缺點:
1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
2、由於存儲類型是object,所以在存數據時會有裝箱操作,在取數據時會有拆箱操作,影響效率
3、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程

使用技巧:
在實際使用過程中,為了避免自動擴容,可以預估數據長度,初始化一個數據長度,從而提高效率

練習實例代碼:

    /// <summary>
    /// ArrayList數組練習操作 
    /// </summary>
    public class ArrayListTest
    {
        /// ArrayList 是Array的升級版,能夠解決Array的一些缺點
        /// ArrayList其內部實現也是Array,只是其長度是可以動態,在其內部用一個變量記錄控制長度,ArrayList有如下一些特點
        /// 1.長度不固定
        /// 2.可以存儲不同的數據類型(object)
        /// 3.同樣支持索引查詢(可以直接通過小標訪問)
        /// 4.靈活性更強,以犧牲性能為代價

        /// 優缺點:
        /// 優點:
        ///     1、長度不固定,在定義是不必擔長度溢出
        ///     2、可以存儲任意數據類型
        ///     3、可根據索引查詢,查詢效率快
        /// 缺點:
        ///     1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
        ///     2、由於存儲類型是object,所以在存數據時會有裝箱操作,在取數據時會有拆箱操作,影響效率
        ///     3、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程
        ///     
        /// 使用技巧:
        ///     在實際使用過程中,為了避免自動擴容,可以預估數據長度,初始化一個數據長度,從而提高效率

        /// ArrayList操作實例
        public static void ArrayListOpert()
        {

            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類

            //// 需要統計時間的代碼段(統計初始化長度時的執行時間)
            st.Start();//開始計時
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("ArryList集合存儲數據量為10000000,初始化一個長度,執行開始:");

            ArrayList arrayList = new ArrayList(10000000);

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                arrayList.Add(1 + 1);
            }

            st.Stop();//終止計時
            Console.WriteLine(string.Format("ArryList集合存儲數據量為10000000,初始化一個長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));

            //// 需要統計時間的代碼段(統計初始化非指定長度時的執行時間)

            st.Restart();
            Console.WriteLine("");
            Console.WriteLine("ArryList集合存儲數據量為10000000,初始化不指定長度,執行開始:");

            arrayList = new ArrayList();

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                arrayList.Add(1 + 1);
            }

            st.Stop();//終止計時
            Console.WriteLine(string.Format("ArryList集合存儲數據量為10000000,初始化不指定長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

四、List集合簡介

 

隨着c#泛型的推出,為了避免ArrayList一些缺點,微軟推出了List集合
List集合內部還是採用的Array實現,同時在定義時需要指定對應的數據類型
這樣級保留了Array集合的優點,同時也避免了ArrayList集合的數據類型不安全和裝箱帶來的性能犧牲
List特點:

  • 1、數據長度不固定,自動增加
  • 2、存儲相同的數據類型
  • 3、可根據索引查詢,查詢效率快

優缺點:
優點:
1、長度不固定,在定義是不必擔長度溢出
2、存儲相同數據類型的數據,避免的數據的裝箱拆箱,提高了數據處理效率
3、支持索引查詢,查詢效率快
缺點:
1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
2、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程

 

練習實例代碼:

   /// <summary>
    /// List練習操作
    /// </summary>
    public class ListTest
    {
        /// 隨着c#泛型的推出,為了避免ArrayList一些缺點,微軟推出了List集合
        /// List集合內部還是採用的Array實現,同時在定義時需要指定對應的數據類型
        /// 這樣級保留了Array集合的優點,同時也避免了ArrayList集合的數據類型不安全和裝箱帶來的性能犧牲
        /// List特點:
        /// 1、數據長度不固定,自動增加
        /// 2、存儲相同的數據類型
        /// 3、可根據索引查詢,查詢效率快
        /// 
        /// 優缺點:
        /// 優點:
        ///     1、長度不固定,在定義是不必擔長度溢出
        ///     2、存儲相同數據類型的數據,避免的數據的裝箱拆箱,提高了數據處理效率
        ///     3、支持索引查詢,查詢效率快
        /// 缺點:
        ///     1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
        ///     2、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程

        /// ArrayList操作實例
        public static void ListOpert()
        {
            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類
            st.Start();//開始計時
                       //// 需要統計時間的代碼段(統計初始化長度時的執行時間)
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("List集合存儲數據量為10000000,初始化一個長度,執行開始:");

            List<int> list = new List<int>(10000000);

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                list.Add(1 + 1);
            }

            //需要統計時間的代碼段

            st.Stop();//終止計時
            Console.WriteLine(string.Format("List集合存儲數據量為10000000,初始化一個長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));

            //// 需要統計時間的代碼段(統計初始化非指定長度時的執行時間)
            st.Restart();
            Console.WriteLine("");
            Console.WriteLine("List集合存儲數據量為10000000,初始化不指定長度,執行開始:");

            list = new List<int>();

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                list.Add(1 + 1);
            }

            st.Stop();//終止計時
            Console.WriteLine(string.Format("List集合存儲數據量為10000000,初始化不指定長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

五、LinkedList集合簡介

LinkedList鏈表的底層是採用雙向鏈表的方式實現,
在鏈表(Linked List)中,每一個元素都指向下一個元素,以此來形成了一個鏈(chain)
可以從頭部和尾部插入數據,在存儲內存上採用非連續方式存儲,鏈表有如下一些特點

  • 1、內存存儲上是非連續的
  • 2、能夠支持從頭部和底部同時插入
  • 3、長度是非固定的

優缺點:
優點:
1、由於非連續存儲,中部插入和刪除元素效率高
2、長度非固定,在創建時不用考慮其長度
3、可以沖頭部和底部添加元素
4、數據類型是安全的,在創建時需要指定的數據類型
缺點:
1、由於非連續存儲,不能通過小標訪問,查詢效率低

練習實例代碼:

    /// <summary>
    /// LinkedList練習操作
    /// </summary>
    public class LinkedListTest {
        /// LinkedList鏈表的底層是採用雙向鏈表的方式實現,
        /// 在鏈表(Linked List)中,每一個元素都指向下一個元素,以此來形成了一個鏈(chain)
        /// 可以從頭部和尾部插入數據,在存儲內存上採用非連續方式存儲,鏈表有如下一些特點
        /// 1、內存存儲上是非連續的
        /// 2、能夠支持從頭部和底部同時插入
        /// 3、長度是非固定的
        /// 優缺點:
        /// 優點:
        ///     1、由於非連續存儲,中部插入和刪除元素效率高
        ///     2、長度非固定,在創建時不用考慮其長度
        ///     3、可以沖頭部和底部添加元素
        ///     4、數據類型是安全的,在創建時需要指定的數據類型
        ///  缺點:
        ///     1、由於非連續存儲,不能通過小標訪問,查詢效率低

        /// LinkedList操作實例
        public static void LinkedListTestOpert() {
            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類
            st.Start();//開始計時
                       //// 需要統計時間的代碼段(統計初始化長度時的執行時間)
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("Linked集合存儲數據量為10000000,執行開始:");

            LinkedList<int> list = new LinkedList<int>();

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                list.AddFirst(1 + 1);
            }

            //需要統計時間的代碼段

            st.Stop();//終止計時
            Console.WriteLine(string.Format("Linked集合存儲數據量為10000000,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

六、每種集合數據執行結果對比分析

 

    class Program
    {
        static void Main(string[] args)
        {
            //// array數組操作測試
            ArrayTest.IntArrayTest();

            //// arrayList集合操測試
            ArrayListTest.ArrayListOpert();

            //// List集合操作測試
            ListTest.ListOpert();

            //// LinkedList集合操作測試
            LinkedListTest.LinkedListTestOpert();

            ///// 通過測試數據
            //通過測試數據大概可以分析得出一些結論
            //1、整體效率上Array效率最高,ArrayList效率最低,List效率介於Array和ArrayList之間
            //2、ArrayList和List集合,在定義時如果知道數據長度,那麼初始化時,指定長度的效率比不指定的長度效率高
            
            
            //總結:
            //在數據集合使用選擇上給出以下一些建議:
            //1、Array:當元素的數量是固定的,並且需要使用下標時
            //2、ArrayList:當存儲的元素類型不同時
            //3、List:當元素的數量是固定的,並且需要使用下標時
            //4、LinkedList:當元素需要能夠在列表的兩端添加時
            Console.ReadLine();
        }
    }

  執行結果數據

 

通過測試數據大概可以分析得出一些結論
1、整體效率上Array效率最高,ArrayList效率最低,List效率介於Array和ArrayList之間
2、ArrayList和List集合,在定義時如果知道數據長度,那麼初始化時,指定長度的效率比不指定的長度效率高

七、總結:

在數據集合使用選擇上給出以下一些建議:
1、Array:當元素的數量是固定的,並且需要使用下標時
2、ArrayList:當存儲的元素類型不同時,初始化時給一個預估的長度
3、List:當元素的數量是固定的,並且需要使用下標時,初始化時給一個預估的長度
4、LinkedList:當元素需要能夠在列表的兩端添加時

附件:

 

關於這一些練習的代碼,上傳到github,有興趣的可以看一下:

 

 

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

【其他文章推薦】

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

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

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

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

一分鐘帶你學會利用mybatis-generator自動生成代碼!

目錄

之前的文章介紹了XML配置方式整合的過程,本文介紹下利用Mybatis-generator生成xml、dao、entity的過程。

一、MyBatis Generator簡介

MyBatis Generator是MyBatis官方提供的代碼生成器,可以生成xml、dao、entity。

官網介紹見:http://mybatis.org/generator/

二、使用方式

MyBatis Generator的使用方式有4種:

  • 命令行生成
  • Maven方式生成
  • 使用Ant任務生成
  • 使用Java代碼生成

本文將使用Intel IDEA+Maven方式生成代碼,因為集成和使用比較簡單,配置完成后直接雙擊運行即可。

三、實戰

首先新建一個SpringBoot項目spring-mybatis-generator,然後按照下面步驟操作。

  1. pom.xml中配置plugin
<!-- 引入mybatis-generator 插件 -->
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.2</version>
    <configuration>
        <!-- mybatis-generator的配置文件,根據情況調整位置 -->
        <configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
    <executions>
        <execution>
            <id>Generate MyBatis Artifacts</id>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>
</plugin>
  1. 修改mybatis-generator.xml文件

上一步pom.xml中指定了一個配置文件,所以在resources目錄下新建mybatis-generator.xml,MyBatis Generator通過這個配置文件才可以進行如下操作:

  • 如何連接到數據庫
  • 生成什麼對象,以及如何生成它們
  • 哪些表應用於對象生成

完整內容下面會有,需要注意的是。

JDBC驅動jar的路徑一定要寫絕對路徑。
JDBC驅動jar的路徑一定要寫絕對路徑。
JDBC驅動jar的路徑一定要寫絕對路徑。

重要的事情說3遍。

mybatis-generator.xml完整內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <!--JDBC驅動jar包的 絕對路徑 -->
    <!--JDBC驅動jar包的 絕對路徑 -->
    <!--JDBC驅動jar包的 絕對路徑 -->
    <classPathEntry location="C:\Users\java_suisui\.m2\repository\mysql\mysql-connector-java\5.1.39\mysql-connector-java-5.1.39.jar"/>

    <!--defaultModelType="flat" 大數據字段,不分表 -->
    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="autoDelimitKeywords" value="true" />
        <property name="beginningDelimiter" value="`" />
        <property name="endingDelimiter" value="`" />
        <property name="javaFileEncoding" value="utf-8" />
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

        <!-- 註釋 -->
        <commentGenerator >
            <property name="suppressAllComments" value="true"/><!-- 是否取消註釋 -->
            <property name="suppressDate" value="true" /> <!-- 是否生成註釋代時間戳-->
        </commentGenerator>

        <!--數據庫鏈接地址賬號密碼-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/demo"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- 類型轉換 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自動轉化以下類型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--生成Model類存放位置-->
        <javaModelGenerator targetPackage="com.example.springbootmybatis.generator.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成mapxml文件 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources" >
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- 生成mapxml對應client,也就是接口dao -->
        <javaClientGenerator targetPackage="com.example.springbootmybatis.generator.dao" targetProject="src/main/java" type="XMLMAPPER" >
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <table tableName="user" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>

        <table tableName="user_role" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>

    </context>
</generatorConfiguration>
  1. 生成代碼

點擊IntelIDEA右側的“Maven Projects”,找到spring-boot-mybatis-generator下面的mybatis-generator:generate,雙擊運行,日誌中出現“BUILD SUCCESS”說明代碼已生成。

運行截圖:

生成代碼截圖:

運行日誌:

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-boot-mybatis-generator 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- mybatis-generator-maven-plugin:1.3.2:generate (default-cli) @ spring-mybatis-generator ---
[INFO] Connecting to the Database
[INFO] Introspecting table user
log4j:WARN No appenders could be found for logger (org.mybatis.generator.internal.db.DatabaseIntrospector).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[INFO] Introspecting table user_role
[INFO] Generating Record class for table user
[INFO] Generating Mapper Interface for table user
[INFO] Generating SQL Map for table user
[INFO] Generating Record class for table user_role
[INFO] Generating Mapper Interface for table user_role
[INFO] Generating SQL Map for table user_role
[INFO] Saving file UserMapper.xml
[INFO] Saving file UserRoleMapper.xml
[INFO] Saving file User.java
[INFO] Saving file UserMapper.java
[INFO] Saving file UserRole.java
[INFO] Saving file UserRoleMapper.java
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

到此利用mybatis-generator自動生成代碼已經全部介紹完成了,有問題歡迎留言溝通哦!

完整源碼地址:

推薦閱讀

限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分佈式、大數據、機器學習等技術。
關注下方公眾號即可免費領取:

本文由博客一文多發平台 發布!

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

【其他文章推薦】

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

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

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

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

柏克萊新制 業者供免洗杯需加收新台幣七元

摘錄自2020年1月6日公視報導

在美國加州的柏克萊1月起有新規定,餐飲業者如果提供「一次性」的免洗杯,每個要加收0.25美分、約新台幣七元的費用,來限制餐廳使用免洗杯。

非營利組織「請內用」發言人尼克說:「你知道許多飲料最貴的部分其實是杯子本身,而不是裡面的飲料?」

打算淘汰免洗杯的,還有知名連鎖店藍瓶咖啡,藍瓶咖啡過去每年要用掉1200萬個紙杯。藍瓶咖啡顧客崔西認為:「垃圾、浪費是重大議題,所以我很高興看到我最喜歡的咖啡店帶頭這麼做。」

奧克蘭北部的柏克萊更積極,當地新法規規定,1月開始,餐飲業者若提供「一次性」的免洗杯,每個要加收0.25美分、約新台幣7元的費用。

但行動不便者認為,沒有免洗杯很不方便,因為玻璃罐和陶瓷杯對他們來說太重了。看見身心障礙計畫創辦人艾莉絲表示:「你不可以有永續性卻沒有彈性,那樣就不叫永續性了。」身障朋友希望政策和店家保有彈性,讓需要的人,還是能使用紙杯,在環保和弱勢權益間取得平衡。

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

【其他文章推薦】

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

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

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

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

伊朗政府宣布:鈾濃縮作業不再受核協議限制

摘錄自2020年1月6日中央社德黑蘭報導

伊朗政府6日指出,將進一步縮減對於2015年核子協議的承諾,鈾濃縮作業將不再受到核子協議限制,但德黑蘭當局仍會持續跟國際原子能總署(IAEA)合作。

伊朗國營電視台報導,伊朗將不再遵守核協議中對於核子作業的任何限制,包括針對伊朗的濃縮鈾離心機數量、濃縮鈾產量、濃縮鈾純度、核子研究及研發等限制。

德黑蘭當局還指出,如果美國取消對伊朗的制裁措施,他們可以迅速取消這些違反核協議限制的舉措。

伊朗原本就預計會在週末宣布對於2015年核協議的最新立場,但恰逢美國軍方3日出動無人機在伊拉克首都巴格達擊殺伊朗革命衛隊聖城部隊(Quds Force)指揮官蘇雷曼尼(Qassem Soleimani),讓敵對情勢大幅升溫。

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

【其他文章推薦】

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

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

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

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

環保署:6 年內補助蔬果運輸車全面汰換電動車

使用柴油的果菜市場傳統蔬果運輸車,會產生大量 PM2.5 細懸浮微粒及高分貝噪音,長期下來對人體恐造成傷害,環保署宣布,將在 6 年內將全國大型果菜市場,合計約 1,778 輛柴油拖板工具車,全面補助汰換為電動蔬果運輸車。   環署空保處長陳咸亨說,若以西螺果菜市場為例,電動蔬果運輸車與傳統柴油拖板車相較之下,雖然電池總使用成本每月約 5,840 至 6,460 元,較傳統柴油拖板車每月 4,000 至 6,100 元來得高,但在環保署的補助下,每個月成本將會降至 2,340 至 3,260 元。   空保處統計,目前包括台北第一果菜批發市場、三重果菜市場、宜蘭果菜市場、興建中的板橋果菜市場等市場皆有意願使用電動蔬果運輸車,環保署也將持續全面推動補助全國果菜市場,盼 6 年內全面汰換為電動蔬果運輸車。

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

【其他文章推薦】

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

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

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

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

特斯拉在港推出換車服務 讓車主可安心購買 Model S

Tesla Model S 電動車在香港大受歡迎,事關 Model S 車主可享「優惠」都幾多,包括首次登記稅豁免優惠、低牌費及低保養維修支出等,令不少燃油汽車車主都想轉投電動車的懷抱。不過換車最麻煩是找代理處理舊車放售。   為鼓勵新客戶輕鬆轉用電動車,Tesla Motors 宣布在港推出換車(Trade-in)服務,只要購買 Model S 即可享用。無論現時擁有的是 Tesla Model S 或其他品牌車輛,客戶都可以選擇透過Tesla的合作夥伴出售其座駕,省卻親自尋找代理處理舊車的麻煩。加上 Tesla 在今年 4 月在港推出回售保值(Resale Value Guarantee)計劃,保證車主其 Model S 將來的保值率,將高於市場上任何量產高級房車,大可放心出車。

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

【其他文章推薦】

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

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

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

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

學習下ElasticSearch

ElasticSearch基礎概念

使用場景:比如分庫的情況下,你想統計所有數據的報表,就把所有數據都放在ElasticSearch上

關係型數據庫 ElasticSearch
數據庫Database 索引index,支持全文檢索
表Table 類型Type
數據行Row 文檔Document
數據列Column 字段Field
模式Schema 映射Mapping

用關係型數據庫就會想到建立一張User表,再建字段等,

而在Elasticsearch的文件存儲,Elasticsearch是面向文檔型數據庫,一條數據在這裏就是一個文檔,用JSON作為文檔序列化的格式

在ES6.0之後,已經不允許在一個index下建不同的Type了,一個index下只有一個Type(以後版本中Type概念會去掉,可以直接把index類比成Table)

節點Node:

  一個ElasticSearch運行的實列,集群構成的單元

集群Cluster:

  由一個或多個節點組成,對外提供服務  

Elasticsearch實現原理-倒排索引

ElasticSearch是基於倒排索引實現的

倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。

通俗地來講,正向索引是通過key找value,反向索引則是通過value找key。

倒排索引—單詞詞典

單詞詞典(Term Dictionary)是倒排索引的重要組成部分。

——記錄所有文檔的單詞,一般都比較大

——記錄單詞到倒排列表的關聯信息(這個單詞關聯了哪些文檔)

倒排索引—排序列表

倒排列表(Posting List)記錄了單詞對應文檔的集合,由倒排索引項(Posting)組成

倒排索引項(Posting)主要包含如下信息

—文檔Id,用於獲取原始信息

—單詞頻率(TF,Term Frequency),記錄該單詞在文檔中出現的次數,用於後序相關算分

—位置(Position),記錄單詞在文檔中的分詞位置,用於做詞語搜索(Phrase Query)

—偏移(Offset),記錄單詞在文檔的開始和結束位置,用於高亮显示

分詞

搜索引擎的核心是倒排索引,而倒排索引的基礎就是分詞。所謂分詞可以簡單理解為將一個完整的句子切割為一個個單詞的過程。也可以叫文本分析,在es稱為Analysis。

如文本:elasticSearch是最流行的搜索引擎

分詞結果:elasticSearch 流行 搜索引擎

分詞器是es中專門處理分詞的組件,英文為Analyzer,它的組成如下

Character Filters:針對原始文本特殊處理,比如除html特殊符

Tokenizer:將原始文本按照一定規則切分為單詞

TokenFilters:針對tokenizer處理的單詞就行在加工,比如轉小寫,刪除或新增處理(比如中文中的  這 呢 無實意的詞)

Analyze API

es提供了一個測試分詞的API接口,方便驗證分詞效果,endpoint是_analyze

—可以直接指定analyze測試

—可以直接指定索引中的字段進行測試

—可以自定義分詞器進行測試

文檔映射Mapping

Mapping類似數據庫中的表結構定義,主要作用如下:

—定義Index下的字段名(Field Name)

—定義字段的類型,比如數值型、字符串型、布爾型等

—定義倒排索引相關的配置,比如是否索引、記錄position等

Dynamic Mapping

es可以自動識別文檔字段類型,從而降低用戶使用成本

SearchAPI介紹和相關性算分

es中存儲的數據進行查詢分析,endpoint為_search

查詢主要有兩種形式

1)URI Search

操作簡單,方便通過命令進行測試

但 僅包含部分查詢語法

GET /indexname/_search?q=user:xx

2)Request Body Search

es提供的完備查詢語法Query DSL(Domain Specific Language)

GET /indexname/_search

{
  ”query”: {
    ”term”: {
      ”user”: “xx”
    }
  }
}

相關算分

相關算分是指文檔與查詢語句直接的相關度,英文為relevance

  通過倒排索引可以獲取與查詢語句相匹配的文檔列表,那麼如何將最符合用戶查詢的文檔放到前列呢

  本質是一個排序問題,排序的依據是相關算分

ES目前主要有兩個相關性算分模型

  TF/IDF模型

  BM25模型 5.x之後的默認模型

BM25相比TF/IDF的一大優化是降低了TF(Term Frequency單詞頻率)在過大時的權重

相關算分是shard與shard間是相互獨立的,也就意味着一個Term的IDF等值在不同shard上是不同的。文檔的相關算分和它所處的shard有關

在文檔數量不多時 會導致相關算分嚴重不準的情況發生

解決辦法

  —設置分片數是一個,從根本排除問題,在文檔數據量不多時可以考慮該方法,(百萬到千萬)

  —二是使用DFS Query Then Ftech查詢方式

Elasticsearch分佈式特性

es支持集群模式,是一個分佈式系統,好處是

—1)增加系統容量:內存、磁盤,使es集群可以支持PB級的數據

如何將數據分佈在所有節點上

  —引入分片 Shard解決問題

分片是ES支持PB級數據的基石

  —分片存儲了部分數據,可以分部在任意節點上

  —分片數在索引創建時指定且後序不允許再更改(即使你後面新增了也用不到),默認5個

  —分片有主分片和副本分片之分,以實現數據的高可用

es集群由多個es實列組成

  —不同集群通過集群名字來區分,可通過cluster.name修改,默認為elasticSearch

  —每個ES實列本質是一個JVM進程,且有自己的名字,通過node.name修改

Master Node:Master節點通過集群中所有的節點選舉產生,可以被選舉的節點稱為master-eligible節點,

      相關配置如下:node.master:true

Coordinating Node:處理請求的節點為Coordinating節點,該節點為所有節點默認角色,不能取消

            作用是把請求路由到正確的節點處理,比如創建索引請求到master節點

Data Node:存儲數據的節點即為data節點,默認節點都是data類型,相關配置如下:node.data.true

—2)提供系統可用性:即部分節點停止服務,整個集群依然可以正常服務

提高系統可用性

服務可用性

  —兩個節點情況下,允許其中一個節點停止服務  

數據可用性

  —引入副本(Replication)解決

  —每個節點上都有完備的數據

複製分片的意義在於容錯性,當一個節點掛了,另一個節點上的分片可以代替掛掉節點上的分片

故障轉移

一:

 二:

 三:

文檔到分片的映射算法

es通過如下公式計算文檔到對應的分片 -shard=hash(routing)%number_of_primary_shards

hash算法保證可以將數據均勻的分散在分片中

routing是一個關鍵參數,默認是文檔id,也可以自行指定

number_of_primary_shards是主片分數(該算法與主片分數相關,這也是分片數量一旦確定就不能修改的原因)

腦裂問題

在上述第一步的時候 node2和node3選舉node2為master節點了時候,此時會更新cluster state

此時node1節點網絡恢復了,node1自己組成集群后,也會更新cluster state

此時:同一個集群有兩個master,而且維護不同的cluster state,網絡恢復后 無法選擇正確的master

解決方案:僅在可選舉master-eligible節點數大於等於quorum時才可以進行master選舉

        即使node1節點恢復了 ,可選節點數未達到quorum,不選舉

 

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

【其他文章推薦】

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

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

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

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