1.池,說白了就是提前創建好了東西放在池子里,你直接去池子里拿去用就行了,有現成的可用的,節省了你臨時創建的時間。
2.jdbc connection,線程thread,對象,這些東西的創建和銷毀都是很消耗時間的,所以我們一般都是提前創建好很多這種創建消耗高的東西,用的時候直接去用就行。
3.數據庫連接池用的地方是:mybatis/hibernate這種sql語句操作時,臨時創建connection是很消耗時間的,所以為了提高獲取數據庫數據的效率,在開機階段都創建很多connection。且connection是tcp長連接的,這些數據庫連接池中的connetcion可以存貨很長時間。
可以設置connection的maxage,數據庫連接池c3p0等,都有保持connection連接存貨的機制,通過connecton發送空數據包保證connection存活。
4.線程池:線程池,主要是因為thread的創建和銷毀是要消耗時間的,thread創建大概消耗0.02秒。java ee服務器在啟動的時候,它已經創建好了很多的thread,用以來http request連接的時候,用這些創建好的thread去處理這些http連接。這些都是tomcat已經幫你做好的功能,Apache早就寫好了類似的代碼。
當處理Io操作時,我們習慣用線程池,因為io操作是阻塞的。所以就是在處理阻塞方法時,我們用多線程來提高效率。
5.常量池:字符創常量池,string那些具體final對象,下次用直接去常量池拿就行,很快 ,免去再次創建。string name="tom";
6.因為池子的特性是容納多個數據,所以池子都是list等集合類,因為要一直保持住這些數據,所以list這些集合類,又要一直保存在內存中,所以很消耗資源的,並且得是靜態的來保證常駐內存。
7.附數據庫連接池代碼和tomcat服務器線程池處理http request方法。
tomcat服務器處理http連接請求,采用多線程,bio,線程池方法
try { ServerSocket ss = new ServerSocket(10000); System.out.println("server start..."); while (true) { Socket s = ss.accept(); new LogicThread(s);//開一個線程來處理請求,這里面調用InputStream.read()讀取請求信息 } } catch (Exception e) { e.printStackTrace(); } } } 4.可以分析創建服務器的每個具體步驟。首先創建ServerSocket,然后接受新的連接請求,在LogicThread中處理請求。 傳統IO方式(阻塞I/O)在調用InputStream.read()/buffer.readLine()方法時是阻塞的,它會一直等到數據到來或緩沖區已滿時或超時時才會返回,並且產生了大量String類型垃圾,盡管可以使用StringBuffer優化;同樣,在調用ServerSocket.accept()方法時,也會一直阻塞到有客戶端連接才會返回,每個客戶端連接過來后,服務端都會啟動一個線程去處理該客戶端的請求。並且多線程處理多個連接。每個線程擁有自己的棧空間並且占用一些 CPU 時間。每個線程遇到外部未准備好的時候,都會阻塞掉。阻塞的結果就是會帶來大量的進程上下文切換。且大部分進程上下文切換可能是無意義的。比如假設一個線程監聽某一個端口,一天只會有幾次請求進來,但是該 cpu 不得不為該線程不斷做上下文切換嘗試,大部分的切換以阻塞告終。