a.什麼是事務:html
事務是程序中一系列嚴密的操做,全部操做執行必須成功完成,不然在每一個操做所作的更改將會被撤銷,這也是事務的原子性(要麼成功,要麼失敗)。java
b.事務的四大特性:程序員
1.原子性(Atomicity):一個事務中全部對數據庫的操做是一個不可分割的操做序列,要麼全作要麼全不作web
2.一致性(Consistency):數據不會由於事務的執行而遭到破壞spring
3.隔離性(Isolation):一個事務的執行,不受其餘事務的干擾,即併發執行的事務之間互不干擾sql
4.持久性(Durability):一個事務一旦提交,它對數據庫的改變就是永久的數據庫
參考連接:http://www.javashuo.com/article/p-xqnzomen-dh.html瀏覽器
http://www.javashuo.com/article/p-peozvczh-cz.html緩存
http://blog.csdn.net/a19881029/article/details/7893622服務器
Hibernate中緩存分爲:一級緩存、二級緩存
第一級別的緩存是 Session 級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由 hibernate 管理的
第二級別的緩存是 SessionFactory 級別的緩存,它是屬於進程範圍的緩存
A.爲何要用緩存?
目的:減小對數據庫的訪問次數!從而提高hibernate的執行效率!
B.概念
1)Hibenate中一級緩存,也叫作session的緩存,它能夠在session範圍內減小數據庫的訪問次數! 只在session範圍有效! Session關閉,一級緩存失效!
2)當調用session的save/saveOrUpdate/get/load/list/iterator方法的時候,都會把對象放入session的緩存中。
3)Session的緩存由hibernate維護,用戶不能操做緩存內容; 若是想操做緩存內容,必須經過hibernate提供的evict/clear方法操做。
C.特色
只在(當前)session範圍有效,做用時間短,效果不是特別明顯!
在短期內屢次操做數據庫,效果比較明顯!
a.緩存相關幾個方法的做用:
session.flush(); 讓一級緩存與數據庫同步
session.evict(arg0); 清空一級緩存中指定的對象
session.clear(); 清空一級緩存中緩存的全部對象
b.批量操做怎樣使用上面方法?
Session.flush(); // 先與數據庫同步
Session.clear(); // 再清空一級緩存內容
c.不一樣的session是否會共享緩存數據?
不會 。不一樣的session使用不一樣的緩存區,不能共享。
參考連接:詳解Hibernate中的一級緩存
hibernate筆記--緩存機制之 一級緩存(session緩存)(這篇文章比較容易理解)
二級緩存是屬於SessionFactory級別的緩存機制。第一級別的緩存是Session級別的緩存,是屬於事務範圍的緩存,由Hibernate管理,通常無需進行干預。第二級別的緩存是SessionFactory級別的緩存,是屬於進程範圍的緩存。
參考連接:詳解Hibernate中的二級緩存
@Configuration把一個類做爲一個IoC容器,它的某個方法頭上若是註冊了@Bean,就會做爲這個Spring容器中的Bean。
@Scope註解 做用域
@Lazy(true) 表示延遲初始化
@Service用於標註業務層組件、
@Controller用於標註控制層組件(如struts中的action)
@Repository用於標註數據訪問組件,即DAO組件。
@Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。
@Scope用於指定scope做用域的(用在類上)
@PostConstruct用於指定初始化方法(用在方法上)
@PreDestory用於指定銷燬方法(用在方法上)
@DependsOn:定義Bean初始化及銷燬時的順序
@Primary:自動裝配時當出現多個Bean候選者時,被註解爲@Primary的Bean將做爲首選者,不然將拋出異常
@Autowired 默認按類型裝配,若是咱們想使用按名稱裝配,能夠結合@Qualifier註解一塊兒使用。以下:
@Autowired @Qualifier("personDaoBean") 存在多個實例配合使用
@Resource默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配。
@PostConstruct 初始化註解
@PreDestroy 摧毀註解 默認 單例 啓動就加載
@Async異步方法調用
答:request--請求對象
response--響應對象
page--頁面對象
pageContext--頁面上下文對象
session--會話對象
application--應用程序對象
out--輸出對象
config--配置對象
exception--例外對象
參考連接:jsp內置對象(百度百科)
1.返回的類型不同。list()返回List,iterate()返回Iterator,
2.獲取數據的方式不同。
a.list()會直接查數據庫,iterate()會先到數據庫中把id都取出來,而後真正要遍歷某個對象的時候先到緩存中找,若是找不到,以id爲條件再發一條sql到數據庫,這樣若是緩存中沒有數據,則查詢數據庫的次數爲n+1。所以:對於list()方式的查詢一般只會執行一個SQL語句,而對於iterator()方法的查詢則可能須要執行N+1條SQL語句(N爲結果集中的記錄數).
b.list()方法沒法利用一級緩存和二級緩存(對緩存只寫不讀),它只能在開啓查詢緩存的前提下使用查詢緩存;
iterate()方法能夠充分利用緩存,若是目標數據只讀或者讀取頻繁,使用 iterate()方法能夠減小性能開銷。
c.list()中返回的List中每一個對象都是本來的對象,iterate()中返回的對象是代理對象.(debug能夠發現)
3.結果集的處理方法不一樣:
list()方法會一次取出全部的結果集對象,並且他會依據查詢的結果初始化全部的結果集對象。若是在結果集很是龐大的時候會佔據很是多的內存,甚至會形成內存溢出的狀況發生。
iterator()方法在執行時不會一次初始化全部的對象,而是根據對結果集的訪問狀況來初始化對象。一次在訪問中能夠控制緩存中對象的數量,以免佔用過多的緩存,致使內存溢出狀況的發生。
總結:
list()方法在執行時,直接運行查詢結果所須要的查詢語句。
iterator()方法則是先執行獲得對象ID的查詢,而後在根據每一個ID值去取得所要查詢的對象。
Filter也稱之爲過濾器,它是Servlet技術中最實用的技術,Web開發人員經過Filter技術,對web服務器管理的全部web資源:例如Jsp,Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞彙、壓縮響應信息等一些高級功能。
Filter實現方式?
答:在HttpServletRequest到達 Servlet 以前,攔截客戶的HttpServletRequest 。根據須要檢查HttpServletRequest,也能夠修改HttpServletRequest 頭和數據。
在HttpServletResponse到達客戶端以前,攔截HttpServletResponse 。根據須要檢查HttpServletResponse,也能夠修改HttpServletResponse頭和數據。
①攔截器是基於java的反射機制的,而過濾器是基於函數回調。
②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
③攔截器只能對action請求起做用,而過濾器則能夠對幾乎全部的請求起做用。
④攔截器能夠訪問action上下文、值棧裏的對象,而過濾器不能訪問。
⑤在action的生命週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器能夠獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裏注入一個service,能夠調用業務邏輯。
參考文章:
Java三大器之攔截器(Interceptor)的實現原理及代碼示例
1.客戶端發送請求給web容器
2.web容器將jsp首先轉譯成servlet源代碼
3.web容器將servlet源代碼編譯成.class 文件
4.web容器執行.class 文件5.web容器將結果響應給客戶端
參考連接:
方法一:繼承Thread類,重寫方法run();
方法二:實現Runnable接口,實現方法run();
實現同步有幾種方法:例如:synchronized,wait,notify均可以實現同步。
對於GC來講,當程序員建立對象時,GC就開始監控這個對象的地址、大小以及使用狀況。一般,GC採用有向圖的方式記錄和管理堆(heap)中的全部對象。經過這種方式肯定哪些對象是"可達的",哪些對象是"不可達的"。當GC肯定一些對象爲"不可達"時,GC就有責任回收這些內存空間。能夠。程序員能夠手動執行System.gc(),通知GC運行,可是Java語言規範並不保證GC必定會執行。強制執行垃圾回收:System.gc()。Runtime.getRuntime().gc()
靜態類:static的是屬於類的,而不是屬於對象的,至關因而全局的,不可能被回收
靜態變量自己不會被回收,可是它所引用的對象應該是能夠回收的。
gc只回收heap裏的對象,對象都是同樣的,只要沒有對它的引用,就能夠被回收(可是不必定被回收). 對象的回收和是否static沒有什麼關係!
如:static Vector pane = new Vector(); pane = null; 若是沒有其它引用的話,原來pane指向的對象實例就會被回收。
Java程序員在編寫程序的時候再也不須要考慮內存管 理。因爲有個垃圾回收機制,Java中的對象再也不有"做用域"的概念,只有對象的引用纔有"做用域"。垃圾回收能夠有效的防止內存泄露,有效的使用可使用的內存。垃圾回收器一般是做爲一個單獨的低級別的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。
參考文章:http://www.cnblogs.com/sstarena/p/6004274.html
1.從地址欄顯示來講
forward 是服務器請求資源,服務器直接訪問目標地址url,把那個url的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容從哪裏來的,因此他的地址仍是原來的地址。
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,因此地址欄顯示的是新的地址。
因此redirect等於客戶端向服務器端發出兩次request,同時也接受兩次response。
2,從數據共享來看
forward:轉發頁面和轉發到的頁面能夠共享request裏面的數據
redirect:不能共享數據
3.從運用地方來講
forward:通常用於用戶登陸的時候,根據角色轉發到相應的模塊。
redirect:通常用於用戶註銷登陸時返回主頁面,和跳轉到其餘網站。
4.從效率來講
forward:高
redirect:低
a.好比在頻繁查詢更新較少的狀況下使用索引
b.儘可能不要作全表掃描
c.慎用子查詢和Union All
d.多表join時儘可能用小表去join大表
e.善用不一樣的存儲引擎,MySQL有多種不一樣的存儲引擎,InnoDB,Aria,MEMORY根據須要給不一樣的表選擇不一樣的存儲引擎,好比要支持transaction的話用InnoDB等
1.關係型數據庫經過外鍵關聯來創建表與表之間的關係,
2.非關係型數據庫一般指數據以對象的形式存儲在數據庫中,而對象之間的關係經過每一個對象自身的屬性來決定
參考文章:
參考連接:uml類圖(Class Diagram)中類與類之間的關係及表示方式