Java中DriverManager跟DataSource獲取getConnection有什麼不同(Java中資料來源和連線池的區別)
一、理解什麼是資料來源和連線池
資料來源:資料的源頭,需要設定資料庫url,使用者名稱和密碼,此時就相當於一個代理資料庫;它包含連線池和連線池管理兩個部分;
Java中的資料來源就是javax.sql.DataSource。DataSource是Java定義的介面,可以有不同的實現。
連線池:一個連線相當於資料來源和dao層的管道,那連線池就相當於存放了很多管道的池子;我們獲取連線不從資料來源取而是從 連線池取;
二、常見的連線池
常見的資料庫連線池:JNDI、 C3p0、 Apache 的Jakarta DBCP、BoneCP
JNDI:負責管理資料庫連線池,進行資料庫資源的管理,在容器中配置一個數據庫連線池,使用JNDI 來管理;如果不使用JNDI的方式,直接在專案中配置資料庫連線池,那麼每個專案需要配置一次,如果更改資料庫地址時,每個專案的資料庫連線方式都要更改,比較麻煩;但使用JNDI的話,直接更改一下JNDI裡面的資料庫連線池的配置就可以了,方便一些。JNDI方式建立實現的datasource是真正實現了javax.sql.datasource;其他的三種方式都不是。
C3P0:是一個開源的JDBC連線池,它實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。目前使用它的開源專案有Hibernate,Spring(sping框架依賴的第三方使用了c3p0和dbcp兩種方式)等;c3p0有自動回收空閒連線功能
DBCP;也具有連線池的功能,但DBCP沒有自動回收空閒連線的功能,
BoneCP:號稱是速度最快的資料庫連線池
三、資料來源和連線池在程式碼中的體現
原生獲取資料庫連線:
String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; String url="jdbc:sqlserver://localhost:1433;databaseName=test_01"; String user="sa",password="123456"; //這裡是你的sa賬號密碼 //載入驅動 Class.forName(driver); // DriverManager獲取一個連線 java.sql.Connection con = DriverManager.getConnection(url,user,password); //通過連接獲取操作資料庫的物件 Statement stmt= con.createStatement(); //操作資料庫增刪改查 String a1="INSERT INTO USERS VALUES('1','xx')"; stmt.executeUpdate(a1);//執行SQL命令物件
現在:spring已經封裝好,直接用mapper物件呼叫方法即可查詢資料庫;那麼具體怎麼實現,需要分析原始碼;sping框架使用了第三方c3p0和dbcp兩種方式,用其中任意一種方式均可;
mybatis中設定連線池:
spring中連線池的設定:
此處使用了c3p0連線池:
四、Java中DriverManager跟DataSource獲取getConnection有什麼不同
當使用JDK提供的java(x).sql包中的類訪問資料庫時候,基本上用到的就是drivermanager,connection,statement,resultset。其中drivermanger是類,他呼叫相應的驅動(即各個資料庫廠商提供的驅動)中的方法生成connection物件。Connection是介面,在各個資料庫廠商提供的資料庫驅動中,都實現了該介面。例如:當使用com.mysql.jdbc.driver時候,生成的connection即為com.mysql.jdbc.Connection物件。
Javax.sql包中定義了介面datasource,統一規定了作為資料來源連線池必須提供的方法和屬性等。各個資料來源元件中提供的datasource都實現了該介面。當通過資料來源連線池的方式獲取connnection的時候,同樣的,各個資料來源元件也都提供(實現了java.sql.connection)介面的類。
更為具體的細節,可以參考jdk文件中關於java(x).sql包中相關類和介面的描述;參考開源資料來源連線池元件的相關原始碼(例如C3P0);參考相關的資料庫驅動。
綜上:DriverManager是獲取一個connection,用完就進行關閉,需要又重新建立連線;
Datasource獲取多個connection並管理起來,作為資料庫連線池;很多第三方連線池都通過實現該介面來做連線池;
DriverManager在Java中的位置,java.sql包下
Datasource在Java中的位置,javax.sql包下
五、Java連線資料庫方法概述
java.sql提供了一些介面和類,用於支援資料庫增刪改查等相關的操作。該jar包定義了java訪問各種不同資料庫(mysql,oracle,sqlserver。。。。。)的統一介面和標準。同時,各個資料庫廠商都提供了該jar包中定義的各個介面的實現類,用於具體實現本廠資料庫的增刪改查操作,即稱之為“資料庫驅動jdbc driver”。例如mysql的資料庫驅動為:com.mysql.jdbc.driver;oracle的資料庫驅動為:oracle.jdbc.driver.oracledriver。
在java程式中訪問資料庫,做資料庫連線時,可以採用兩種方式:
1、使用java.sql API
利用該包提供的各種介面和類直接訪問資料庫。
2、使用資料庫連線池
目前存在多個開源的java資料庫連線池(本文第二部分),這些連線池都是在java.sql基礎上編寫而成,其實都是對java.sql的封裝;
注:此部分參考部落格:https://www.cnblogs.com/sandea/p/4213538.html