個人階段性學習總結
這一個月的個人學習總結
1.struts+spring+hibernate框架學習及使用:
a.struts2主要負責接收網頁中表單提交的資料,然後通過 Action 進行處理,再 Forward 到對應的網頁;
b.spring相當於一個大容器,將struts2和hibernate整合進來。spring負責業務層管理,主要利用IoC和AoP對action,service,dao,資料訪問源以及宣告式事務等管理;
c.hibernate主要負責持久化層,完成資料庫的 crud 操作。
2.struts2學習:
1.Struts2基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與檢視的資料互動,Struts2框架的絕大部分功能都是通過攔截器來完成的,
當FilterDispatch攔截到使用者請求後,大量攔截器將會對使用者請求進行處理,然後呼叫定義的Action類中的方法進行處理請求,其工作流程如下:
(1) 使用者訪問頁面,客戶端(Client)向Action發用一個請求(Request);
(2) Container通過web.xml對映請求,並獲得控制器(Controller)的名字
(3) 容器(Container)呼叫Struts2核心過濾器(StrutsPrepareAndExecuteFilter)。在Struts2(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前呼叫FilterDispatcher,Struts2.1以後呼叫StrutsPrepareAndExecuteFilter。
(4) 控制器(Controller)通過ActionMapper獲得Action的資訊
(5) 控制器(Controller)呼叫ActionProxy
(6) ActionProxy讀取struts.xml檔案獲取action和interceptor stack的資訊。
(7) ActionProxy把request請求傳遞給ActionInvocation
(8) ActionInvocation依次呼叫action和interceptor
(9) 根據action的配置資訊,產生result
(10) Result資訊返回給ActionInvocation
(11) 產生一個HttpServletResponse響應
(12) 產生的響應行為傳送給客服端。
下面是流程圖:
2.流程原始碼剖析:
1)StrutsPrepareAndExecuteFilter-> void init(FilterConfig filterConfig)方法進行初始化操作,並呼叫核心方法voiddoFilter(ServletRequest req, ServletResponse res, FilterChain chain),
在該方法中:
a. 處理了HttpServletRequest和HttpServletResponse;
b. 獲取ActionMapping,ActionMapping: String name, String method, Stringextension, private Map<String, Object> params, private Result result;
c.整個框架最核心的方法:executeAction(request, response, mapping)
2)executeAction(request,response, mapping) -> serviceAction(request, response, mapping)serviceAction 詢問ActionMapper呼叫相應的action處理該請求 -> 解析mapping中的引數,交給ActionProxy 來處理,通過代理模式執行ActionProxy
執行原始碼:
if (mapping.getResult() != null) {
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}
3)voidexecute(ActionInvocation invocation) -> Interceptor, action, result ->HttpServletResponse
3.在專案學習開發中,多個action可以採用動態方法呼叫:
1)通過設定method屬性,method="相應的方法名";
2)通過感嘆號,首先需要在strut2.xml中新增<constantname="struts.enable.DynamicMethodInvocation"value="true"></constant>,當請求/login!*.action時,就會呼叫相應的action;
3)萬用字元: actionname=*; result={1},第三種比較常用
4.Struts2使用json
當struts2返回json資料時,首先新增struts2-json-plugin依賴, 然後是在struts.xml中,在package中extends修改為extends="json-default" ,最後新增相應的<result name="json"type="json">
3.hibernate學習:
1.hibernate工作原理以及步驟:
a.讀取並解析配置檔案;
b.讀取並解析對映資訊,SessionFactory;
c.建立事物Transaction
d.持久化操作
e.提交事物
f.關閉Session
g.關閉SessionFactory
在專案開發中對於POJO的對映一般都會採用註解的方式進行對映。
2.hibernate的三種狀態:
1)瞬時物件: 對於剛建立的一個物件,如果Session中和資料庫中都不存在改物件,那麼該物件就是瞬時物件;
2)離線物件: 離線物件就是資料庫中存在該物件,但該物件有沒有被session託管
3)持久化物件: 瞬時物件呼叫save方法,或者離線物件呼叫update方法變成持久化物件。即對改物件的任何修改,都會在提交事物時才會與之進行比較,如果不同則傳送一個條update語句,否則就不會發送語句。
3.hibernate中的get方法和load方法的區別:
1)返回結果:
load方法查不到的話會丟擲org.hibernate.ObjectNotFoundException異常;
get方法查不到的話會返回null。
2)查詢機制上對比:
load方法會首先去Session快取中查,查詢到則返回,查詢不到回判斷是否為lazy(延遲載入),不是lazy會丟擲異常,是lazy會先建立代理物件,當真正操作該物件時會訪問資料庫,查詢不到丟擲異常;
get方法會直接去資料庫中查詢,查詢不到返回null
3)本質區別
load方法,hibernate會認為該物件一定在資料庫中存在,可以放心使用代理物件來延遲載入,當真正操作該物件時才會訪問資料庫,查不到丟擲異常;
get方法會先查快取,沒有查資料庫,沒有返回nul,get方法一定是返回的是實體物件。
4.hibernate3和hibernate4的稍微區別:
1)對於hibernate3的SessionFactory的屬性引數bean配置使用的包是:org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;
對於hibernate4的SessionFactory的屬性引數bean配置使用的包是:org.springframework.orm.hibernate4.LocalSessionFactoryBean
2)hibernate3中的獲取的Session的getSession方法已經被摒棄
hibernate4中通過getSessionFactory().getCurrentSession()來獲取一個Session
5.在專案開發中一般都讓DaoImplement繼承HibernateSupport,然後呼叫getHibernateTemplate(),使用封裝好的簡單CRUD
4.protobuf學習:
protobuf就是一種資料傳輸的方式,跟json一樣可以取代xml來進行資料的傳輸,與json相比在大資料的條件下,protobuf資料壓縮所在的大小優於json。
首先新增依賴:protobuf-java
測試:
protoc檔案:
package tutorial;
option java_package="com.ssh.protobuftest.protobuf";
option java_outer_classname="PersonProbuf";
message Person{
required string name =1;
required int32 id=2;
optional string email=3;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber{
required string number=1;
optional PhoneType type=2[default = HOME];
}
repeated PhoneNumber phone=4;
message CountryInfo{
required string name=1;
required string code=2;
optional int32 number=3;
}
}
message AddressBook{
repeated Person person=1;
}
測試java程式碼:
import java.util.List;
import com.google.protobuf.InvalidProtocolBufferException;
import com.ssh.protobuftest.protobuf.PersonProbuf.Person;
import com.ssh.protobuftest.protobuf.PersonProbuf.Person.PhoneNumber;
public class TestPb {
public static void mian(String[] args) {
Integer a=new Integer(2);
a.equals(2);
//java_outer_classname.message name.Builder builder=java_outer_classname.messagename.newBuilder();
PersonProbuf.Person.Builder builder=PersonProbuf.Person.newBuilder();
//builder進行一系列的get/set方法
builder.setEmail("[email protected]");
builder.setId(1);
builder.setName("TestName");
builder.
//使用add是在一個message還有一個message,即類似內部類
//addxxx用來給內部message賦值,其中set可以連續set
addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().
setNumber("131111111").setType(PersonProbuf.Person.PhoneType.MOBILE));
builder.addPhone(PersonProbuf.Person.PhoneNumber.newBuilder().
setNumber("011111").setType(PersonProbuf.Person.PhoneType.HOME));
//呼叫build方法轉換成message物件
Person person=builder.build();
//轉成二進位制流並儲存在陣列中
byte[] buf=person.toByteArray();
try {
Person person2 = PersonProbuf.Person.parseFrom(buf);
System.out.println(person2.getName() + ", " + person2.getEmail());
List<PhoneNumber> lstPhones = person2.getPhoneList();
for (PhoneNumber phoneNumber : lstPhones) {
System.out.println(phoneNumber.getNumber());
}
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
System.out.println(buf);
}
}
5.MySql效能優化學習:
1.優化方案:1)建立索引,使用索引查詢(型別,最好選擇基本型別,eg: INT,建立的欄位選擇,選擇修改少,查詢多的欄位);
2)sql語句優化,最好不要過多張表關聯,少使用函式和%等導致索引失效的sql;
3)表結構(水平拆分,垂直拆分);
4)引擎選擇;
5)使用快取
6)主從結構(讀寫分離),主庫抗寫壓力,通過從庫來分擔讀壓力,對於寫少讀多的應用。
2.因為mysql預設採用的是InnoDB,所以提高InnoDB的效能很有必要:
1)innodb_flush_log_at_trx_commit 設為2
當設為0,能使效能明顯提升,但是不安全;
當設為1,每次插入資料時都會自定提都會重新整理到磁碟中,效能低
同理set AUTOCOMMIT=0;
2)開啟慢查詢日誌show.log
增加引數: log-queries-not-using-indexes 將所有沒有走索引的sql都會記錄到show.log中,方便找出沒有使用索引的sql語句;
3)使用explian檢視sql語句的執行形式,判斷是否有走索引,訪問的行數rows;
4)提高查詢query_cache命中率;
5)關閉skip_name_resolve,減少逆向解析dns的消耗;
6)innodb_log_file_size 設為50%,對於高併發寫入效能高,(太大recovery變慢,太小影響查詢效能)
7)根據業務要求,考慮是否可關閉xa事務(分散式事務),有效減少磁碟重新整理次數
8)反正規化使用冗餘欄位,增加一些必要的冗餘欄位,以空間換時間增加開發的工作量和維護量
9)增加中間表,對需要經常聯合查詢的表,建立中間表以提高查詢效率。通過建立中間表,把需要經常聯合查詢的資料插入到中間表中,然後將原來的聯合查詢改為對中間表的查詢,以此來提高查詢效率。
10)垂直拆分,有時候有些欄位使用頻率很低或者欄位的資料型別比較大,那麼可以考慮垂直拆分的方法,把不常用的欄位和大欄位拆分出去,就是從業務角度來看,將關聯性不強的資料拆分到不同的instance上,從而達到消除瓶頸的目標。對於重複讀型別比較多的場景,我們還可以加一層cache(快取),來減少對DB的壓力
11)水平拆分,水平拆分之後,任何例項都只有全量的1/n的資料,eg: 將userinfo拆分為3個cluster,每個cluster持有總量的1/3資料,3個cluster資料的總和等於一份完整 資料,但會給應用增加複雜度,它通常在查詢時需要多個表名,查詢所有資料需要union操作
下面是兩張分散式計算的資料庫框架圖,順便也呈現出來:
上述內容若有錯誤,歡迎各位拍磚指出,
相關推薦
個人階段性學習總結
這一個月的個人學習總結 1.struts+spring+hibernate框架學習及使用: a.struts2主要負責接收網頁中表單提交的資料,然後通過 Action 進行處理,再 Forward 到對應的網頁; b.spring相當於
2017年度個人技術學習總結
個人學習總結 2017年馬上就過去了,記得年初的時候對2017年的技術學習規劃還歷歷在目,當時定下的年度目標是通過報一個學習課程系統的學習和掌握Linux技術,從而為Openstack雲計算打好基礎,最終通過比較和篩選,我選擇了51CTO網絡學院的馬哥教育Linux系統架構師培訓課程。 馬哥課程的邏輯思路、概
階段性學習總結
點播 直接 情況下 共勉 實現 leaf 哈哈哈 leet 操作 此次項目還有不到一周就完結了。因此對自己做的前兩個項目的學習做一下總結。 先說下這兩個項目都是怎麽寫出來的。首先,大體上了解一下項目原型,因為我是一個初學者,所以也就只能從最籠統的角度知道這個項目是幹什麽的,
個人vx學習總結
vuex最大的作用就是為了讓兩個不相干的元件也能進行資料共享,vuex主要是怎麼做的呢 定義狀態 => 方法改變狀態 => 什麼時候改變狀態 => vue頁面獲取狀態 先在js檔案寫入以下程式碼 const state = { mo
個人js學習總結-陣列字串的轉換join()、split()
<script> //contat()用於連結兩個及以上陣列,但不改變現有的陣列,僅僅返回被連線陣列的一個副本 var arr01 = [1,2,3]; var arr02 = ["a","b","c"]; arr01.contat(arr02); //結果為[1
個人js學習總結-陣列內容的新增和刪除的方法-push()、unshift()、pop()、shift()
<script> var arr = [1,2,3,4,5]; //新增陣列內容 //1、使用push()可以向陣列的末尾新增一個及一個以上的元素,並返回新的長度,把6放到最後面 arr.push(6); console.log(arr.push(6));//返回
個人hadoop學習總結:Hadoop叢集+HBase叢集+Zookeeper叢集+chukwa監控(包括單機、偽分佈、完全分佈安裝操作)
環境介紹: 虛擬機器四個: hadoop-marster hadoop-salve1 hadoop-salve2 hadoop-salve3 ===========================1.Hadoop==============================
關於網絡運維學習的階段性簡要總結(華為篇)
華為 學習總結 眾所周知,學習是一件反人類的事情,但是你要從中發現它的有趣之處,便可妙趣橫生。學會是一件重要的事,會總結很重要。今天就總結一下我的學習。 A代表同一網段 B代表不同網段 GW代表網關 IP------A------IP
C++ primer 個人學習總結
歡迎大家來訪二笙的小房子,一同學習分享生活! 文章目錄 1. 個人見解:C++ 2. primer學習總結 2.1 第一章:開始 2.2 Part1:C++基礎 2.3 Part2:C++標準庫 2.4 Part3:類設
Java個人學習總結——物件集合部分
一、有關元素遍歷時的刪除和插入 1、foreach遍歷迴圈的本質是使用iterator進行遍歷,注意集合遍歷時不要一邊遍歷一邊刪除,不能用集合的remove方法進行元素的刪除,需要直接用iterator的remove方法進行刪除,錯誤示例如下: Iterator<S
Redis的個人學習總結
20181024更 在此之前,筆者只知道redis是個記憶體資料庫,很多公司用。 Redis是什麼?什麼場景適合用Redis?Redis的安裝和基本用法有哪些? Redis官網https://redis.io/ Redis的官網沒有Windows版本的redis,需要到github上
Swift學習總結(個人總結,以方便理解為主)
swift總結 一、註冊cell 1.用nib, 向 tableview 註冊 cell 全域性變數 let cellIdentifier = "myCell" myTableView!.registerNib(UINib(nibName: "MyCell", bundle
Synchronized的個人學習總結
這篇文章是我個人前段時間學習大神們對於Synchronized講解的總結。個人認為挺適合小白從0開始理解Synchronized的。因為我也是看網上的文章加自己寫程式碼理解的,可能也有錯誤,有問題的話,請各位在評論區指出哈。 如果大家急於求成,想馬上知道S
Maven學習總結(37)——利用GitHub或阿里雲OSS物件儲存、又拍雲、七牛雲端儲存等搭建個人Maven倉庫
無論是用Nexus還是HTTP伺服器搭建Maven倉庫,總歸需要一臺伺服器,一臺伺服器需要花錢買和花時間維護,成本比較大。Nexus一般是公司用的比較多,個人不推薦使用。本文就是介紹一些適合個人搭建M
xampp構建虛擬域名【個人課程學習經驗總結,部分摘自他處,僅供學習參考】
識別 代碼 contain sample virt 自定義 ping 定義 3.1 末尾添加: <VirtualHost *:80> DocumentRoot "D:\Server\xampp\htdocs\zerg\public" ServerNam
設計模式學習總結(八)策略模式(Strategy)
isp 筆記本 override div ont 角色 write stat 通過 策略模式,主要是針對不同的情況采用不同的處理方式。如商場的打折季,不同種類的商品的打折幅度不一,所以針對不同的商品我們就要采用不同的計算方式即策略來進行處理。 一、示例展示: 以
設計模式學習總結(七)適配器模式(Adapter)
實現接口 國外 手機 額外 sed ges program ebe 通過 適配器模式主要是通過適配器來實現接口的統一,如要實現國內手機在國外充電,則需要在不同的國家采用不同的適配器來進行兼容! 一、示例展示: 以下例子主要通過給筆記本電腦添加類似手機打電話和發短
Linux下常用命令之sed學習總結
linux sed sed命令 正則表達式 sed總結 Sed功能說明:Sed是linux下一個強大的文本文件處理工具,通過對文件增加、刪除、查找、查詢操作,配合正則表達式以實現工作中的各種需求。同時也是一名運維人員必須掌握的核心技能。---------------------------
Paxos 學習總結
max 更強 分開 由於 zab ted 偽代碼 big commit 近期學習了分布式領域的重要算法Paxos,這裏羅列下關鍵點當作總結。自己水平有限,難免存在謬誤,懇請讀者指正。本篇不包含Paxos的基本理論介紹。Paxos基礎能夠參考以下的學習資料
Java IO流學習總結
系統 指針 數組 rar amr redo 修改 接收 學習 Java IO流學習總結 Java流操作有關的類或接口: Java流類圖結構: 流的概念和作用 流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱為流,流