JDBC 之C3P0 & DBCP之外的連線資料庫你不會知道這些
C3P0 DBCP連線資料庫 除此之外的連線實現 |
---|
在沒有深入的認識JDBC之前我也是認為,只要會用C3P0和DBCP連線資料庫
能夠根據需要配置資料庫連線池就是會jdbc了 但是如果沒有使用開源的
這兩種連線呢?你是否瞭解JDBC那些你不知道的實現?
一、會使用C3P0和DBCP當然是必要的
那麼大部分人都會使用的這兩種連線如何實現呢?
什麼是資料庫連線池如圖告訴你
1、認識資料庫連線池
為解決傳統開發中的資料庫連線問題,可以採用資料庫連線池技術。 資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。 預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從“緩衝池”中取 出一個,使用完畢之後再放回去。 資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一 個現有的資料庫連線,而不是重新建立一個。 資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池 中,這些資料庫連線的數量是由最小資料庫連線數來設定的。無論這些資料庫連線是否被使用,連線池都將一直 保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線數,當應用 程式向連線池請求的連線數超過最大連線數量時,這些請求將被加入到等待佇列中。 |
---|
2、使用JDBC 你需要知道其實現:★(本文首先解析獲取Connection)
二、使用C3P0建立連線:
(一)描述:
開源組織提供實現:
C3P0 資料庫連線池DataSource 通常被稱為資料來源,
它包含連線池和連線池管理兩個部分,
習慣上也經常把 DataSource 稱為連線池
DataSource用來取代DriverManager來獲取Connection,獲取速度快,
同時可以大幅度提高資料庫訪問速度。
(二)不多說:(上乾貨)使用C3P0的步驟
<1>加入jar包:
連線MySql:
mysql-connector-java-5.1.37-bin.jar//mysql獲取驅動 c3p0-0.09.1.2.jar //c3p0
連線Oracle:
ojdbc14.jar //Oracle
c3p0-0.09.1.2.jar //c3p0
<2>c3p0沒有使用配置檔案在程式碼中如何實現
//測試c3p0純程式碼實現未基於配置檔案(使用靈活度低)
其中url協議如圖:
//此處只是基本的幾項連線池配置
@Test public void testC3p0() throws Exception{ //1.建立DataSource資料來源(相當於建立連線池) ComboPooledDataSource cpds = new ComboPooledDataSource(); //2.設定資料庫連線物件的引數 //2-1 連線的資料庫驅動 cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver /*cpds.setDriverClass( "oracle.jdbc.driver.OracleDriver" ); //loads the jdbc driver 此處實現oracle連線*/ //2-2連線的資料庫 的url//注意連線埠號和資料庫名不同 cpds.setJdbcUrl("jdbc:mysql://localhost:3306/資料庫名" ); /*cpds.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:xe" ); 此處連線oracle*/ //2-3 設定使用者名稱 cpds.setUser("****"); //2-3設定密碼 cpds.setPassword("&&&&"); //3.設定連線池的一些限制 //3-1 設定連線池中連線的初始個數 cpds.setInitialPoolSize(5); //3-2 設定連線池中連線物件的每次增長個數 cpds.setAcquireIncrement(3); //3-3 設定連線池的最大連線個數 cpds.setMaxPoolSize(10); //3-4 設定連線池的最小連線個數 cpds.setMinPoolSize(5); //4.獲取可用連線 Connection connection = cpds.getConnection(); System.out.println(connection); //省略了使用 //5.關閉連線 connection.close();//放回到連線池 } }
<3>使用配置檔案xml將屬性配置配置檔案中
★★注意:將xml配置檔案放在src下
測試將連上述接池配置屬性以properties格式
如:(mysql 和 oracle 不同實現記得根據資料庫改url 和 driver配置引數)
< property name=”driverClass”>com.mysql.jdbc.Driver
< property name=”user”>root
< property name=”password”>root
放在在配置檔案c3p0-config.xml檔案中基於配置檔案(使用靈活度高)
測試c3p0基於xml配置實現如下
@Test
public void testC3p0_1() throws Exception{
//配置檔案中定義的<named-config name="helloc3p0">
ComboPooledDataSource cpds = new ComboPooledDataSource("helloc3p0");
Connection connection = cpds.getConnection();
System.out.println(connection);
connection.close();
}
二、使用DBCP建立連線:
(一)描述:
DBCP資料來源
DBCP 是 Apache 軟體基金組織下的開源連線池實現,
該連線池依賴該組織下的另一個開源系統:Common-pool.
pool.jar:連線池實現的依賴庫
Tomcat 的連線池正是採用該連線池來實現的。該資料庫連線池既可以與應用服
務器整合使用,也可由應用程式獨立使用。
(三)實現DBCP連線步驟:
<1>加入jar包:
連線MySql:
commons-pool-1.5.5.jar //依賴資料池
Commons-dbcp.jar:連線池的實現 //dbcp的jar包
mysql-connector-java-5.1.37-bin.jar //mysql獲取驅動
連線Oracle:
ojdbc14.jar //加入oracle驅動
commons-pool-1.5.5.jar //依賴資料池
Commons-dbcp.jar:連線池的實現 //dbcp的jar包
<2>dbcp沒有使用配置檔案在程式碼中如何實現
//測試dbcp純程式碼實現未基於配置檔案(使用靈活度低)
//此處只是基本的幾項連線池配置
@Test
public void testDbcp_1() throws Exception{
//建立資料來源物件(相當於建立一個連線池)
BasicDataSource bds = new BasicDataSource();
//2.設定引數
bds.setDriverClassName("com.mysql.jdbc.Driver");
/*bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");實現oracle連線*/
bds.setUrl("jdbc:mysql://localhost:3306/資料庫名");
/*bds.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:xe");*/
bds.setUsername("root");
bds.setPassword("root");
//設定連線池的初始連線個數
bds.setInitialSize(5);
//設定連線池的最多連線個數
bds.setMaxActive(10);
//設定連線池的最少的空閒連線個數
bds.setMinIdle(3);
//設定連線池的最多的空閒連線個數
bds.setMaxIdle(5);
//3.獲取連線
Connection connection = bds.getConnection();
System.out.println(connection);
//4.關閉
connection.close();
}
<3>dbcp使用配置檔案xml將屬性配置配置檔案中
★★注意:將xml配置或prope檔案放在src下
測試將連上述接池配置屬性以properties格式
dbcp-config.xml如:(mysql 和 oracle 記得改不同資料庫的配置引數)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="xxxx" />
<property name="username"><value>xxxx</value></property>
<property name="password"><value>xxxxx</value></property>
<property name="maxActive"><value>20</value></property>
<property name="initialSize"><value>1</value></property>
<property name="maxWait"><value>60000</value></property>
<property name="maxIdle"><value>20</value></property>
<property name="minIdle"><value>3</value></property>
<property name="removeAbandoned"><value>true</value></property>
<property name="removeAbandonedTimeout"><value>180</value></property>
<property name="connectionProperties"><value>clientEncoding=GBK</value></property>
放在在配置檔案dbcp-config.xml檔案中基於配置檔案(使用靈活度高)
放置在dbcp.properties中
dbcp.driverClassName=com.ibm.db2.jcc.DB2Driver
dbcp.url=jdbc:db2://192.168.3.11:50000/DBNAME
dbcp.username=db2admin
dbcp.password=password
dbcp.initialSize=30
dbcp.minIdle=10
dbcp.maxIdle=10
dbcp.maxWait=1000
dbcp.maxActive=30
測試dbcp基於基本配置實現如下:
@Test
public void testDbcp_2() throws Exception{
Properties pro = new Properties();
pro.load(new FileInputStream("src/dbcp"));
//建立資料來源物件(相當於建立一個連線池)
BasicDataSource bds = (BasicDataSource) BasicDataSourceFactory.createDataSource(pro);
//獲取連線
Connection connection = bds.getConnection();
System.out.println(connection);
//關閉連線
connection.close();//放回連線池
}
四、如果沒有c3p0和dbcp
1、通過註冊驅動來獲取Connection connection連線
url:
格式: jdbc:子協議:子名稱
jdbc:mysql://資料庫伺服器的主機名:埠號/* 資料庫名
jdbc:mysql:///資料庫名 (連線的資料庫服 務器為本機)
2、註冊驅動的兩種方式
<1>方式一:通過呼叫registerDriver(此方法作作為了解不建議使用)
- 1、依賴性太強
-
- 2、導致驅動類載入兩遍
-
//註冊驅動方式一
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//獲取連線
Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/資料庫名”,”root”,”root”);
<3>註冊驅動方式二:Class.forName(“com.mysql.jdbc.Driver”);利用反射獲取驅動推薦使用
Class.forName(“com.mysql.jdbc.Driver”);
//通過方式二註冊驅動後獲取連線的三種方式(基於其構造器引數不同)
//2.獲取連線物件Connection的三種方式
方式一(構造器一):
獲取連線物件Connection
/*
* 引數1:url
* 引數2:使用者名稱
* 引數3: 密碼
*
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/資料庫名","root","root");
方式二(構造器二)
獲取連線物件Connection
/*
* 引數1:url?user=使用者名稱&password=密碼
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/資料庫名?user=root&password=root");
方式三(構造器三)
獲取連線物件Connection
Properties pro=new Properties();
pro.load(new FileInputStream("db.properties"));
/*
*
* 要求:屬性檔案中至少要包含 user屬性和password屬性
*
* 引數1:url
* 引數2:裡面封裝了user和password屬性的 Properties物件
*/
Connection connection = DriverManager.getConnection(pro.getProperty("url"),pro);