資料來源和連線池
資料來源
從接觸DBMS開始就在用資料來源(DataSource),它其中很重要的一個作用就是可以管理Connection,管理的方式也就是經常聽到的ConnectionPool。它的管理其實就是對DriverManager獲取Connection進行了包裝。
下面就首先看看用DataSource來取代DriverManager來獲取Connection的好處:
一般DataSource內部會用一個連線池來快取Connection,這樣獲得Connection速度很快,可以大幅度提高資料庫的訪問速度;通過它獲得的Connection都是已經被包裹過的(不是驅動原來的連線),他的close
連線池
前面部落格講了,操作資料庫的一般步驟:
1.註冊驅動
2.建立連線
3.建立執行sql語句的物件
4.執行語句
5.處理執行結果
6.釋放資源
上面的過程其實就是客戶端與DB伺服器互動的過程。這個過程就像兩個人隔著一條河想要交流一樣,其中最費時間的莫過於屬搭橋的過程了。上面第二步“建立連線”的過程也就是搭橋的過程了。
所以,建立Connection就相當於建一座橋,是資料庫操作中最耗時的。所以用完以後就關掉是很浪費的。現在,建立完以後將它放到集合中(arrayList
上面說的集合其實就是連線池了,連線池可以理解成一個能夠存放Connection的Collection,有兩種形式,即arrayList或linkList。arrayList實際為一個數組,訪問速度很快;linkList為一個連結串列,增、刪速度比較快。而連線池中的Connection需要頻繁的增刪,所以採用linkList來作為Connection物件的容器集合。
下面就用程式碼模擬一個DataSource內部的連線池:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList; /** * @author-zhipeng */ public class MyDataSource { private static String url = "jdbc:mysql://localhost:3306/jdbc"; private static String user = "root"; private static String password = ""; private static int initCount = 5; private static int maxCount = 10; private int currentCount = 0; //建立一個LinkedList作為Connection的容器 LinkedList<Connection> connectionsPool = new LinkedList<Connection>(); //初始,建立5個Connection物件放到LinkedList中,用的時候從連結串列頭部取,不用了放到尾部 public MyDataSource() { try { for (int i = 0; i < initCount; i++) { this.connectionsPool.addLast(this.createConnection()); this.currentCount++; } } catch (SQLException e) { throw new ExceptionInInitializerError(e); } } //建立連線時就呼叫這個方法--從Connection連結串列容器頭部取一個 public Connection getConnection() throws SQLException { //枷鎖-針對併發操作 synchronized (connectionsPool) { //如果連線池(實際為LinkList)中還有Connection物件則取出一個 if (this.connectionsPool.size() > 0) return this.connectionsPool.removeFirst(); //如果連線池沒有(初始為5個)Connection物件,而請求連線數小於最大連線數,則建立一個新的Connection if (this.currentCount < maxCount) { this.currentCount++; return this.createConnection(); } //否則丟擲異常,超過最大連線數,沒有連線可用 throw new SQLException("已沒有連結"); } } //關閉連線時就呼叫這個方法--不是真正的釋放連線,而是放到從Connection連結串列容器的尾部 public void free(Connection conn) { this.connectionsPool.addLast(conn); } //建立Connection的根程式碼 private Connection createConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } }
從上面的程式碼實現可知,如果超過Connection Pool的最大連線數(10個)則必然會因沒有連線可以使用而拋異常,下面就用程式碼實驗一下:
/**
* @author-zhipeng
*/
public class TestConnectionPool {
private static DataSource myDataSource = null;
/**
* 迴圈建立11個Connection,期間都不釋放(關閉)
*/
public static void main(String[] args) throws Exception {
for (int i = 0; i < 11; i++) {
Connection conn = myDataSource.getConnection();
System.out.println(conn);
//JdbcUtils.free(null, null, conn);
}
}
}
然後執行,就會發現,當建立第11個的時候就會丟擲異常:
這也驗證了我們上面的實現。當然還可以進行一系列其它的測試,比如建立五個再釋放一個,然後再建立一個,這是你就會發現,Connection Pool的“佇列”結構。
總結
上面簡單介紹了DataSource,和Connection Pool,並用程式碼簡單模擬了它的原理。這也是對舊知識的溫習和加深理解的過程吧。
相關推薦
Java中DriverManager跟DataSource獲取getConnection有什麼不同(Java中資料來源和連線池的區別)
一、理解什麼是資料來源和連線池 資料來源:資料的源頭,需要設定資料庫url,使用者名稱和密碼,此時就相當於一個代理資料庫;它包含連線池和連線池管理兩個部分; Java中的資料來源就是javax.
資料來源和連線池
資料來源 從接觸DBMS開始就在用資料來源(DataSource),它其中很重要的一個作用就是可以管理Connection,管理的方式也就是經常聽到的ConnectionPool。它的管理其實
資料來源和連線池的區別
資料來源是指資料的來源,比如資料庫。連線是指這樣一個“池子”,池子中的每個東西都是連線資料來源的一個“連線”,這樣別人想連線資料來源的時候可以從這個“池子”裡取,用完以後再放回來供以後其他想使用的人使用。我們一般說的資料來源指的就是資料庫~比較形象點的說,連線池就像資料來源的
有關Datasource 和 Connection Pool(資料來源和連線池)
1.首先我先簡單介紹一下資料來源與連線池:(1)資料來源(Data Source)是提供某種所需要資料的器件或原始媒體。JDBC中提供了javax.sql.DataSource介面,負責建立與資料庫的連線。 DataSource物件可以由Web伺服器提供,前提是需要在伺服器配
java配置多資料來源多連線池的工具類,這裡是mysql和mongoDB
public class DBManager { private static final String PREFIX="jdbc:apache:commons:dbcp:"; private static Log log =LogFactory.getLog(DBManager.clas
Java 資料庫事務和連線池
資料庫事務 Java 本身同樣對資料庫事務處理作了支援,事務針對上篇部落格 JDBC 連線資料庫是涉及到的 Connection 物件,獲取的 Connection 物件預設是自動 commit(提交) 對資料庫做的修改的,由此當事務不能完整執行就會導致資料庫資料修改錯誤(如常見的銀行轉
java----day30(DBUtils和連線池)
DBUtils 概述 DBUtils是java程式設計中的資料庫操作實用工具,小巧簡單實用。 DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫程式碼。 Dbutils三個核心功能介紹 QueryRunner中提供對sql語句操作的API.
spring boot2.0+shiro+mybatis多資料來源+druid連線池專案整合
關於整合 網上關於springboot2.0和shiro+myabtis整合的案例很少,大神的教程也是用jpa編寫,jpa很方便,但是還有很多人用mybatis,加之剛學習完mybatis多資料來源整合和druid連線池監控配置,所以算是階段性記錄。 專案目
Mybatis 原始碼分析:資料來源與連線池
1. mybatis 資料來源原理分析 mybatis 資料來源 DataSource 的建立是在解析配置檔案 <environment /> 元素下子元素 <dataSource /> 時建立的。配置如下: <dataSource
JDBC連線資料庫----------資料來源與連線池
1.資料來源與連線池技術 資料來源在JDBC擴充套件包中定義了javax.sql.DataSource 介面,負責建立與資料庫的連線,在訪問資料庫的時候不必編寫連線資料庫的程式碼,可以直接從資料來源中獲得與資料庫的連線。 資料來源DataSource事先建立多個
JDBC原理和連線池技術
JDBC原理: Java Datebase Connectivity:java訪問資料庫的解決方案 .希望用相同的方式訪問不同的資料庫,以實現與具體資料庫無關的java操作頁面 .JDBC定義了一套標準介面,即訪問資料庫通用的API,不同的資料庫廠商根據各自的 資料庫的特點去實現這些介面 具體實現是
nodejs解決mysql和連線池(pool)自動斷開問題
最近在做一個個人專案,資料庫嘗試使用了mongodb、sqlite和mysql。分享一下關於mysql的連線池用法。專案部署於appfog,專案中我使用連線池連結資料庫,本地測試一切正常。上線以後,經過幾次請求兩個資料介面總是報503。一直不明就裡,今天經過
連線資料庫(java驅動連線和連線池連線)
使用java驅動連線資料庫: String url ="jdbc:mysql://localhost:3306/zhongruan"; String usernam
redis之Jedis-API介紹和連線池使用
Redis的各種語言客戶端列表,請參見Redis Client。其中Java客戶端在github上start最高的是Jedis和Redisson。Jedis提供了完整Redis命令,而Redisson有更多分散式的容器實現。 新增maven 依賴
DBUtils和連線池的筆記和總結
今日內容介紹 1、DBUtils 2、連線池 01DButils工具類的介紹個三個核心類 * A: DButils工具類的介紹個三個核心類 * a: 概述 * DBUtils是ja
JDBC和連線池使用步驟
從實習到現在已經快一年啦,學習了很多也遺忘了很多,最近有空所以把以前的筆記整理一下放到部落格上。 JDBC:java database connectivity JDBC定義一套標準介面,即訪問資料庫的通用API,不同的資料庫廠商根
原始碼分析----Mybatis資料來源與連線池
對於ORM框架而言,資料來源的組織是一個非常重要的一部分,這直接影響到框架的效能問題。本文將通過對MyBatis框架的資料來源結構進行詳盡的分析,並且深入解析MyBatis的連線池。 本文首先會講述MyBatis的資料來源的分類,然後會介紹資料來源是如何載入和使用的。緊
《深入理解mybatis原理》 Mybatis資料來源與連線池
對於ORM框架而言,資料來源的組織是一個非常重要的一部分,這直接影響到框架的效能問題。本文將通過對MyBatis框架的資料來源結構進行詳盡的分析,並且深入解析MyBatis的連線池。 本文首先會講述MyBatis的資料來源的分類,然後會介紹資料來源是如何載入
spring配置hibernate 資料來源(資料連線池)
現在常用的開源資料連線池主要有c3p0、dbcp和proxool三種,其中: hibernate開發組推薦使用c3p0; spring開發組推薦使用dbcp(dbcp連線池有weblogic連線池同樣的問題,就是強行關閉連線或資料庫重啟後,無法reconnect,
javaweb-事務和連線池
一、事務 什麼是事務? 事務,一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的一個程式執行單元。這些單元要麼全都成功,要麼全都不成功。 做一件事情,這個一件事情