数据库连接池和connection的理解
數(shù)據(jù)庫連接池Data Source Pool的理解
1.數(shù)據(jù)庫連接池允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個連接,避免了每個方法里new connection的耗費資源和時間。
2.數(shù)據(jù)庫連接池是在項目啟動時候初始化的,以方便程序運行時,隨時可以調(diào)用這些已經(jīng)被創(chuàng)建好的connection。只需要getConnection()就好。
connection的建立、斷開都由連接池自身來管理。
3.創(chuàng)建connection是個很耗時的操作,所以建議在項目啟動的時候去創(chuàng)建connection。避免在方法里需要connection時再去new一個connection是很耗費時間的。
4.數(shù)據(jù)庫連接池,怎樣歸還connection?
Connection connection = pool.getConnection();?
pool.release(connection);//歸還資源?
5.程序啟動時候,是怎樣初始化一個數(shù)據(jù)連接池的?
答:spring啟動會自動ioc注入bean,相當于new已經(jīng)配置好的連接池類。連接池類里面聲明了static的list,用以裝放connection。然后通過static代碼塊來將conection add進這個list。這樣,整個list就在new bean的時候,在加載這個連接池類的時,就先創(chuàng)建好了。后期程序運行時候,那些connection就已經(jīng)存在了。
connection的理解
1.jdbc connection就是一個連接數(shù)據(jù)庫的TCP實例。
2.connection是個長連接的TCP。不像hTTP是個短連接的,每次都要3次握手才能建立。
3.connection長連接是提高了性能。不過還有一些細節(jié)的問題需要解決,即mysql發(fā)現(xiàn)一個鏈接長時間沒有執(zhí)行查詢請求,就會自動斷掉這個連接。
4.具體多長時間后斷掉,有個timeout設置時間。通過sql:"show global variables like '%timeout';" 查看。
當鏈接已經(jīng)失效了,仍然去執(zhí)行查詢操作,一個明顯的表現(xiàn)形式就是提示:MySQL server has gone away
5.數(shù)據(jù)庫連接池通過心跳機制,每間斷一段時間發(fā)送空數(shù)據(jù)包來保持維護connection存活的。
6.長連接適用于要進行大量數(shù)據(jù)傳輸?shù)那闆r,如:數(shù)據(jù)庫,redis,memcached等要求快速,數(shù)據(jù)量大的情況下。?
7.我們平常用的數(shù)據(jù)庫連接都是長連接的,因為我們每次都是從數(shù)據(jù)庫連接池中去拿connection的!!!db source里都是長連接!!
8.mysql默認的connection timeout時間是8小時。這個可以通過my.ini配置文件修改。
9.connection不是線程安全的!Connection不是線程安全的,它在多線程環(huán)境中使用時,會導致數(shù)據(jù)操作的錯亂,特別是有事務的情況.connection.commit()方法就是提交事務,你?
可以想象,在多線程環(huán)境中,線程A開啟了事務,然后線程B卻意外的commit,這該是個多么糾結(jié)的情況.
10.多個線程同用一個connection會不會提高效率,減少多次連接的消耗?答:不會,因為connection里,每個方法都是synchronized,都執(zhí)行了同步。所以并不會提高效率。
如:
public int executeUpdate(){?
synchronized(connection){?
//do?
}?
}?
11.菜鳥一般都是兩種方法使用connection:1。要么就是只用一個connection,多個線程都用一個connection。2.要么就是每個方法里面創(chuàng)建一個connection,每次調(diào)用都創(chuàng)建?
一個connection。
這兩種都是效率低下的。
因為TCP鏈接的創(chuàng)建開支是昂貴的,當然DB server所能承載的TCP并發(fā)連接數(shù)也是有限制的.因此每次調(diào)用都創(chuàng)建一個Connection,這是不現(xiàn)實的;所以才有了數(shù)據(jù)庫連接池的出現(xiàn).
?
創(chuàng)建一個數(shù)據(jù)庫連接池:
public class SimplePoolDemo {//創(chuàng)建一個連接池private static LinkedList<Connection> pool = new LinkedList<Connection>(); //初始化10個連接static{try {for (int i = 0; i < 10; i++) {Connection conn = DBUtils.getConnection();//得到一個連接 pool.add(conn);}} catch (Exception e) {throw new ExceptionInInitializerError("數(shù)據(jù)庫連接失敗,請檢查配置");}}//從池中獲取一個連接public static Connection getConnectionFromPool(){return pool.removeFirst();//移除一個連接對象 }//釋放資源public static void release(Connection conn){pool.addLast(conn);} }?
總結(jié)
以上是生活随笔為你收集整理的数据库连接池和connection的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程书籍阅读随谈(第四篇)
- 下一篇: winword.exe是什么