1. 程式人生 > >Java中DriverManager跟DataSource獲取getConnection有什麼不同(Java中資料來源和連線池的區別)

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

六、分別列出幾種連線池的編碼例子

可依然參考此部落格:https://www.cnblogs.com/sandea/p/4213538.html