常用資料庫連線池配置及使用(Day_11)
阿新 • • 發佈:2020-09-09
世上沒有從天而降的英雄,只有挺身而出的凡人。
——致敬,那些在疫情中為我們挺身而出的人。
-
執行環境
JDK8 +IntelliJ IDEA 2018.3
優點:
使用連線池的最主要的優點是效能。建立一個新的資料庫連線所耗費的時間主要取決於網路的速
度以及應用程式和資料庫伺服器的(網路)距離,而且這個過程通常是一個很耗時的過程。而採用
資料庫連線池後,資料庫連線請求可以直接通過連線池滿足而不需要為該請求重新連線、認證到
資料庫伺服器,這樣就節省了時間。
缺點:
資料庫連線池中可能存在著多個沒有被使用的連線一直連線著資料庫(這意味著資源的浪費)
一、導包
xml檔案:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6
7 <groupId>com.papercy</groupId>
8 <artifactId>DBCP</artifactId>
9 <version>1.0-SNAPSHOT</version>
10 <dependencies>
11 <dependency>
12 <groupId>mysql</groupId>
13 <artifactId>mysql-connector-java</artifactId>
14 <version>5.1.48</version>
15 </dependency>
16
17 <!--C3P0-->
18 <dependency>
19 <groupId>c3p0</groupId>
20 <artifactId>c3p0</artifactId>
21 <version>0.9.1.1</version>
22 </dependency>
23 <!--DBCP -->
24 <dependency>
25 <groupId>commons-dbcp</groupId>
26 <artifactId>commons-dbcp</artifactId>
27 <version>1.4</version>
28 </dependency>
29
30 <dependency>
31 <groupId>commons-pool</groupId>
32 <artifactId>commons-pool</artifactId>
33 <version>1.5.7</version>
34 </dependency>
35
36 <dependency>
37 <groupId>junit</groupId>
38 <artifactId>junit</artifactId>
39 <version>4.13</version>
40 </dependency>
41
42 <!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
43 <dependency>
44 <groupId>com.mchange</groupId>
45 <artifactId>mchange-commons-java</artifactId>
46 <version>0.2.15</version>
47 </dependency>
48 </dependencies>
49
50 </project>
二、DBCP
DBUtil 類
1 package com.papercy;
2
3 import org.apache.commons.dbcp.BasicDataSource;
4
5 public class DBCPUtils {
6 private static String DRIVER="com.mysql.jdbc.Driver";
7 private static String URL="jdbc:mysql://localhost/lob?useUnicode=true&characterEncoding=utf8";
8 private static String USERNAME="root";
9 private static String PASSWORD="123456";
10
11 //獲取BasicDataSource並配置,開始....
12 private static BasicDataSource basicDataSource=new BasicDataSource();
13 static {
14 basicDataSource.setUrl(URL);
15 basicDataSource.setUsername(USERNAME);
16 basicDataSource.setPassword(PASSWORD);
17 basicDataSource.setInitialSize(10);//初始化建立十個連結
18 basicDataSource.setMaxActive(10);//允許同時10個活動連線數
19 basicDataSource.setMaxIdle(8);//最大空閒連線數
20 basicDataSource.setMinIdle(1);//最小空閒連線數
21
22 }
23
24 public static BasicDataSource getBasicDataSource(){
25 return basicDataSource;
26 }
27 }
測試類
1 package com.papercy;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.SQLException;
6
7 public class TestDBUtil {
8 public static void main(String[] args) {
9 try {
10 Connection conn=DbcpDBUtil.getDataSource().getConnection();
11 String sql="INSERT INTO student(id,`name`,age) VALUES(NULL,?,?)";
12 PreparedStatement preparedStatement=conn.prepareStatement(sql);
13 preparedStatement.setString(1,"feifeiye");
14 preparedStatement.setInt(2,88);
15 int count=preparedStatement.executeUpdate();
16
17 if (count>0){
18 System.out.println("插入成功");
19 }else{
20 System.out.println("插入失敗");
21 }
22
23 } catch (SQLException e) {
24 e.printStackTrace();
25 }
26 }
27 }
注:其中的Close方法不會真正的將連線關閉,而是將其放回到連線池中,對於所有的資料來源一般都會改寫此方法(使用修飾)。
方式二:使用BasicDataSourceFactory+配置檔案
配置檔案dbcp.properties:
1 diverClassName=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/lob?useUnicode=true&characterEncoding=utf8 3 user=root 4 pwd=123456
1 package com.papercy; 2 3 import org.apache.commons.dbcp.BasicDataSourceFactory; 4 5 6 import javax.sql.DataSource; 7 import java.io.FileInputStream; 8 import java.io.FileNotFoundException; 9 import java.io.IOException; 10 import java.io.InputStream; 11 import java.util.Properties; 12 13 public class DbcpDBUtil { 14 public static DataSource getDataSource(){ 15 Properties properties=new Properties(); 16 String path="src/dbcp.properties"; 17 try { 18 InputStream inputStream=new FileInputStream(path); 19 properties.load(inputStream); 20 } catch (FileNotFoundException e) { 21 e.printStackTrace(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 26 27 DataSource dataSource=null; 28 try { 29 dataSource= new BasicDataSourceFactory().createDataSource(properties); 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } 33 return dataSource; 34 } 35 }
三、C3P0
C3P0Util類
1 package com.papercy.c3p0; 2 3 import com.mchange.v2.c3p0.ComboPooledDataSource; 4 5 import javax.sql.DataSource; 6 import java.sql.Connection; 7 import java.sql.PreparedStatement; 8 import java.sql.ResultSet; 9 import java.sql.SQLException; 10 11 /** 12 * C3P0工具類 13 */ 14 public class C3p0Utils { 15 //定義資料來源物件 16 private static DataSource dataSource; 17 //獲取資料來源 18 static { 19 dataSource=new ComboPooledDataSource(); 20 } 21 //通過資料來源獲取資料庫連線 22 public static Connection getConnection(){ 23 try { 24 return dataSource.getConnection(); 25 } catch (SQLException e) { 26 e.printStackTrace(); 27 return null; 28 } 29 } 30 //關閉預處理物件和結果集物件 31 public static void close(PreparedStatement preparedStatement, ResultSet resultSet){ 32 if (resultSet!=null){ 33 try { 34 resultSet.close(); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } 38 } 39 40 if (preparedStatement!=null){ 41 try { 42 preparedStatement.close(); 43 } catch (SQLException e) { 44 e.printStackTrace(); 45 } 46 } 47 48 } 49 }
C3P0測試類
1 package com.papercy.c3p0; 2 3 import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; 4 5 import java.sql.Connection; 6 import java.sql.PreparedStatement; 7 import java.sql.ResultSet; 8 import java.sql.SQLException; 9 10 /** 11 * 測試C3P0 12 */ 13 public class TestC3p0Pools { 14 public static void main(String[] args) { 15 Connection conn=C3p0Utils.getConnection(); 16 String sql="SELECT * FROM EMPLOYEES"; 17 PreparedStatement preparedStatement=null; 18 ResultSet resultSet=null; 19 try { 20 preparedStatement=conn.prepareStatement(sql); 21 resultSet=preparedStatement.executeQuery(); 22 while(resultSet.next()){ 23 int id=resultSet.getInt("EID"); 24 String firstName=resultSet.getString("FIRSTNAME"); 25 String lastName=resultSet.getString("LASTNAME"); 26 int age=resultSet.getInt("AGE"); 27 System.out.println(id+"\t"+firstName+"\t"+lastName+"\t"+age); 28 } 29 } catch (SQLException e) { 30 e.printStackTrace(); 31 }finally { 32 C3p0Utils.close(preparedStatement,resultSet); 33 } 34 } 35 }
注:
- acquireIncrement: 聲明當連線池中連線耗盡時再一次新生成多少個連線,預設為3個
- initialPoolSize: 當連線池啟動時,初始化連線的個數,必須在minPoolSize~maxPoolSize之間,預設為3
- minPoolSize: 任何時間連線池中儲存的最小連線數,預設3
- maxPoolSize: 在任何時間連線池中所能擁有的最大連線數,預設15
- maxIdleTime: 超過多長時間連線自動銷燬,預設為0,即永遠不會自動銷燬
PS: