天天看點

2019年4月份

4月1日

        為什麼要使用 hibernate?

               使用Hibernate很大程度上取決于2點優勢。 

               (1)Hibernate對jdbc進行了封裝,簡化了我們操作Dao層的編碼工作。

               (2)Hibernate提供了優秀的緩存機制,可以幫助我們的程式跑得更快。

        什麼是ORM

                 ORM是對象關系映射。就是把資料庫中的字段,映射到Java實體的屬性裡面。

                 常用的ORM架構有Mybatis與Hibernate。

         Hibernate與Mybatis的差別

                  我就個人經曆過的項目而言,我對下面的幾點很有體會。

                  (1)速度。如果一個項目沒有複雜的SQL語句,那麼使用Hibernate顯得很容易。Hibernate因為封裝了基本的增删改查的SQL語句,是以速度很快。而Mybatis對于開發者更加靈活,它是自己編寫的SQL語句,是以可以适應一些複雜的SQL場景。是以,看項目。如果項目不複雜,使用Hibernate。如果項目較為複雜,使用Mybatis。

                  (2)難度。Hibernate有一套很成熟的HQL語句,而且Hibernate還有其它非常多的配置,學習難度比Mybatis大許多。

          hibernate 中如何在控制台檢視列印的 SQL 語句?

                    在配置檔案裡面,把hibernate.show_SQL設定為true就行了,但是可能會降低一定的性能。

          hibernate 有幾種查詢方式?

                     原生SQL、HQL、條件查詢。

          hibernate 實體類可以被定義為 final 嗎?

                     可以加上final,以前我試過。不過被final修飾的類不能被繼承,那麼cglib動态代理就不能建立這個類的子類。是以相關的性能優化,延遲加載,将被舍棄掉。

           在 hibernate 中使用 Integer 和 int 做映射有什麼差別?

                     Integer可以映射為null,但是int不能映射為null

           hibernate 是如何工作的?

                     讀取配置檔案

                     建立SesssionFactory

                     建立Session

                     建立事務

                     持久化

                     送出事務

                     關閉session

                     關閉sessionFactory

            get()和 load()的差別?

                     get不支援延遲加載,而load支援延遲加載。

           說一下 hibernate 的緩存機制?

                     一級緩存是session緩存。session緩存是事務級别的緩存,因為session對象的生命周期通常對應着資料庫中的一個事務。舉個例子,如果我們調用get方法查詢并傳回了一個對象,第二次查詢這個對象的時候就會傳回session緩存中已經存在的這個對象,而不用在去資料庫中查詢。一級緩存是由Hibernate直接管理的,是以我們不能手動關閉一級緩存。

                     二級緩存是SessionFactory緩存。SessionFactory緩存是程序級别的緩存,因為sessionFactory對象的生命周期與項目相同。二級緩存中的緩存對象可以被整個應用程式中的任何Session對象共享,即使關閉目前Session對象,建立的Session對象仍可使用。

           hibernate 對象有哪些狀态?

                     瞬時狀态:直接 new 出來的對象,該對象還沒被持久化(沒儲存在資料庫中)

                     持久化狀态:當調用 Session 的 save/get/load 等方法的時候,對象就是持久化狀态。

                     遊離狀态:Session 關閉之後對象就是遊離狀态。

           hibernate 實體類必須要有無參構造函數嗎?為什麼?

                     因為Hibernate需要調用反射的相關API,是以會調用對象的無參構造函數建立對象。是以要求實體要提供一個無參的構造函數。

4月2日

          MyBatis 中 #{}和 ${}的差別是什麼?

                      井号是預編譯的SQL語句,解析後的SQL語句的參數會帶上引号。

拼接SQL語句,是以不會帶上引号。

                      一般來說,在動态排序中,使用美元符号才能達到要求。比如   select * from 表  order by ${id}

                      另外值得一提的是,美元符号的因為是SQL語句的拼接,可能會導緻一些SQL注入的風險。是以要對使用者的輸入進行正規表達式的校驗。 

            MyBatis的分頁

                       第一種是自己手動編寫分頁,在MySQL中使用limit關鍵字。

                       第二種是使用PageHelper分頁插件,調用startPage()方法來開啟分頁。分頁插件的辦法,我在畢業設計中使用過。

                       第三種是邏輯分頁,它是一次性查詢很多資料,然後在資料中再進行檢索。這種辦法效率低,占用記憶體大。

            MyBatis 是否支援延遲加載?

                        MyBatis 支援延遲加載,設定 lazyLoadingEnabled=true 即可。

            懶加載原理

                        一個對象裡面持有另外一個對象。比如A對象持有B對象。我們查詢出來了A對象,但是會發現B對象是一個null。隻有調用B對象的時候,才會去資料庫查詢出B對象。這就是懶加載。

                         一言以蔽之:什麼時候調用,什麼時候查詢。

             MyBatis 的一級緩存和二級緩存

                         Mybatis的一級緩存是基于同一個SqlSession的緩存。就是會把查詢出來的資料儲存下來,下次再查詢的時候,先看看緩存裡面有沒有,如果有的話,就不查詢資料庫了。如果沒有,才需要查詢資料庫。

                         Mybatis的二級緩存是基于同一個namespace下的所有SqlSession。同一個namespace下的SqlSession查詢到的資料将會共享。同樣的,擷取資料的時候,先從緩存中擷取,如果沒有,才查詢資料庫。

4月2日  

2019年4月份

 從RabbitMQ 結構圖來看,有如下幾個 過程:

1. 消息從生産者Producer發送到交換機Exchange

2.交換機根據路由規則将消息轉發到相應隊列

3. 隊列将消息進行存儲

4.消費者訂閱隊列消息,并進行消費

             RabbitMQ 的使用場景有哪些?

                         (1)異步處理。一般的注冊流程中,可能會有把注冊資訊插入資料庫、發送注冊郵件、發送注冊短信這三個步驟。而發送注冊郵件和發送注冊資訊可以使用RabbitMQ進行異步處理。這樣可以減少用戶端等待的時間。用戶端實際等待的時間隻有資料寫入資料庫的時間。剩下的交給消息中間件異步處理即可。

                         (2)流量削峰。比如在搶購系統中,如果一瞬間有大量的使用者請求,先把這些使用者請求寫入到消息中間件中,然後再進行處理。如果請求數量超過消息中間件的最大隊列,那麼就提示使用者再等一會再來操作。這樣可以防止我們的系統因為過大的負載而崩潰的情況。

              RabbitMQ 有哪些重要的角色?

                         生産者,用于建立消息并把消息發送給消息隊列。

                         代理:用來儲存消息,并把消息投遞給指定的接收者。 

                         消費者:用來接收消息,并根據消息進行進一步業務處理。

              RabbitMQ 有哪些重要的元件?

2019年4月份

                         連接配接管理器ConnectionFactory,我們的應用程式與RabbitMQ建立連接配接的管理器。

                         Exchange(交換器):用于接受、配置設定消息。

                         Channel(信道):消息推送使用的通道。

                         Queue(隊列):用于存儲生産者的消息。      

--------------------------------------------------------------------------------------------------------------------------

                         RoutingKey(路由鍵):用于把生成者的資料配置設定到交換器上。

                         BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上。

              RabbitMQ 中 vhost 的作用是什麼?

                         每一個RabbitMQ都能建立很多vhost。這個vhost可以了解為虛拟主機。就是一個 mini版本的RabbitMQ,擁有自己的交換器與隊列。

              RabbitMQ 的消息是怎麼發送的?

                           用戶端必須連接配接到 RabbitMQ 伺服器才能釋出和消費消息。

                           首先用戶端和 rabbit server 之間會建立一個 tcp 連接配接。

                           一旦 tcp 打開并通過了認證,你的用戶端和 RabbitMQ 就建立了一條符合标準協定的信道(channel)

                           後來的發消息和接收消息都是由這信道完成的。

              RabbitMQ 怎麼保證消息的穩定性(中間網絡斷開怎麼辦? )?

                           提供了事務的功能。缺點是 事務模式會極大的消耗RabbitMQ的性能。

                           通過将 channel 設定為 confirm(确認)模式。類似于TCP三向交握一樣,消息發送方與消息接收方互相發送确認封包。隻有接收方确認了已經接收到消息,那麼才認為資料成功發送。否則認為發送失敗,需要重新發送消息。

              RabbitMQ 怎麼避免消息丢失?

                           把消息持久化磁盤,保證伺服器重新開機消息或者意外當機不丢失。

                           ACK确認機制,消費端消費完成要通知服務端,服務端才把消息從記憶體删除。

              要保證消息持久化成功的條件有哪些?

                           1) Exchange 設定持久化

                           2)Queue 設定持久化

                           3)Message持久化發送

              RabbitMQ 持久化有什麼缺點?

                           因為使用的是磁盤而非記憶體存儲,進而降低了吞吐量。

              RabbitMQ 有幾種廣播類型?             

                           topic:路由器根據正則,把消息投遞到指定的隊列中。

繼續閱讀