資料庫連接池(DBCP和C3P0) 一.資料庫連接池的概念 資料庫連接池可以理解為是存放多個資料庫連接的集合。 作用;解決建立資料庫連接耗費很多資源和時間問題,提高性能 Java為資料庫連接池提供了公共的介面:javax.sql.DataSource,各個廠商需要讓自己的連接池實現這個介面。這樣應用 ...
資料庫連接池(DBCP和C3P0)
一.資料庫連接池的概念
資料庫連接池可以理解為是存放多個資料庫連接的集合。
作用;解決建立資料庫連接耗費很多資源和時間問題,提高性能
Java為資料庫連接池提供了公共的介面:javax.sql.DataSource,各個廠商需要讓自己的連接池實現這個介面。這樣應用程式可以方便的切換不同廠商的連接池!
連接池圖解:
二..DBCP連接池:
1.簡單介紹:
dbcp是apache組織的開源的連接池
2.使用步驟:
①添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar
②,編寫配置文件(四大信息)
配置文件名以 .properties結尾
最好放在src目錄下
配置文件信息如下:
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/day05db username=root password=root
③編寫連接池工具類
1 import java.sql.Connection; 2 import java.sql.ResultSet; 3 import java.sql.SQLException; 4 import java.sql.Statement; 5 import java.util.Properties; 6 7 import javax.sql.DataSource; 8 9 import org.apache.commons.dbcp.BasicDataSourceFactory; 10 /* 11 * javax.sql.DataSource介面 12 * DBCP連接池實現類: 13 * BasicDataSource 14 * BasicDataSourceFactory 15 * 16 * 連接池的創建步驟 : 17 * 1:創建一個空的連接池 18 * BasicDataSource dataSource = new BasicDataSource(); 19 * 2:給這個連接池設置四大信息--->連接池會自動的向池子中存放連接 (預設一般是10個) 20 * dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 21 * dataSource.setUrl("jdbc:mysql://localhost:3306/day04db"); 22 * dataSource.setUserName("root"); 23 * dataSource.setPassword("123"); 24 * 25 * 3:封裝一個方法,對外提供一個連接池中連接 26 * getConntion(); 27 */ 28 public class MyDBCPUtils { 29 private static DataSource dataSource=null; 30 //創建一個空的連接池 31 static{ 32 Properties properties=new Properties(); 33 try { 34 35 properties.load(MyDBCPUtils.class.getClassLoader().getResourceAsStream("dbcp.properties")); 36 /*MyDBCPUtils.class.getClassLoader().getResourceAsStream("dbcp.properties") 37 * 方法會自動的去bin目錄中找配置文件夾 38 */ 39 /* 40 * 該方法會做兩件事情: 41 * 1:自動從Properties集合中獲取四大信息 42 * 2: 創建一個有連接的連接池 43 */ 44 dataSource=BasicDataSourceFactory.createDataSource(properties); 45 } catch (Exception e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 50 } 51 /** 52 * 創建一個靜態方法 ,可以讓外界獲取連接對象 53 * @return Connection 54 * @throws Exception 55 */ 56 public static Connection getConnection() throws Exception{ 57 return dataSource.getConnection(); 58 } 59 /** 60 * 61 * @param rs 結果集對象,沒有寫null 62 * @param stat sql執行平臺對象 63 * @param conn 資料庫連接對象 64 */ 65 public static void closeAll(ResultSet rs,Statement stat,Connection conn){ 66 67 if(rs!=null){ 68 try { 69 rs.close(); 70 } catch (SQLException e) { 71 // TODO Auto-generated catch block 72 e.printStackTrace(); 73 } 74 } 75 if(stat!=null){ 76 try { 77 stat.close(); 78 } catch (SQLException e) { 79 // TODO Auto-generated catch block 80 e.printStackTrace(); 81 } 82 } 83 84 //這裡這個close不是關流釋放資源,而是重寫方法,將連接放回連接池 85 if(conn!=null){ 86 try { 87 conn.close(); 88 } catch (SQLException e) { 89 // TODO Auto-generated catch block 90 e.printStackTrace(); 91 } 92 } 93 } 94 95 }
④使用編寫的工具類(簡單demo)
1 import java.sql.Connection; 2 import java.sql.PreparedStatement; 3 import java.sql.ResultSet; 4 5 public class Test01 { 6 public static void main(String[] args)throws Exception{ 7 //獲得連接 8 Connection conn = MyDBCPUtils.getConnection(); 9 10 //獲得sql語句的執行平臺 11 PreparedStatement stat = conn.prepareStatement("select * from student"); 12 //獲得結果集 13 ResultSet result = stat.executeQuery(); 14 //處理結果集 15 16 while(result.next()){ 17 System.out.println(result.getInt("stu_id")); 18 } 19 //釋放資源 20 MyDBCPUtils.closeAll(result, stat, conn); 21 22 } 23 24 }
三.C3P0連接池
1.簡單介紹
C3P0開源免費的連接池!目前使用它的開源項目有:Spring、Hibernate等。使用第三方工具需要導入jar包,c3p0使用時還需要添加配置文件 c3p0-config.xml
2使用步驟:
①:導入jar包
②:編寫配置文件
文件類型:xml
文件名必須是 c3p0-config.xml,放在src中
簡單的文件demo:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!-- 4 dataSource.setDriverClass("com.mysql.jdbc.Driver"); 5 dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day05db"); 6 dataSource.setUser("root"); 7 dataSource.setPassword("123"); 8 9 1:獲取name屬性:driverClass 10 2:進行字元串拼接:setDriverClass 11 3: 反射setDriverClass() 12 4: 調用setDriverClass()給變數賦值:com.mysql.jdbc.Driver 13 --> 14 <c3p0-config> 15 <default-config> 16 <property name="driverClass">com.mysql.jdbc.Driver</property> 17 <property name="jdbcUrl">jdbc:mysql://localhost:3306/day05db</property> 18 <property name="user">root</property> 19 <property name="password">123</property> 20 </default-config> 21 </c3p0-config>
③編寫連接池使用工具類
1 /* 2 * javax.sql.DataSource介面 3 * 實現類:ComboPooledDataSource 4 * 5 * 創建連接池: 6 * 1:創建一個空的連接池 7 * ComboPooledDataSource dataSource = new ComboPooledDataSource(); 8 * 2: 設置四大信息--->連接池會自動的存放連接 9 * dataSource.setXxx(""); 10 * dataSource.setXxx(""); 11 * dataSource.setXxx(""); 12 * dataSource.setXxx(""); 13 */ 14 15 public class MyC3P0Utils { 16 /* 17 * 1:該對象在創建的時候會自動的檢測是否有c3p0-config.xml 18 * 2: 如果沒有c3p0-config.xml 19 * 你需要手動的設置四大信息 20 * 3: 如果有c3p0-config.xml 21 * 1:該對象在創建的時候會自動的解析xml文件 22 * 2:獲取四大信息 23 * 3: 創建連接池,並向連接池中存放連接池 24 */ 25 private static DataSource dataSource = new ComboPooledDataSource(); 26 27 //封裝一個方法,讓別人能夠獲取連接池中的連接 28 public static Connection getConnetion()throws Exception{ 29 30 return dataSource.getConnection(); 31 } 32 33 public static void closeAll(ResultSet rs, Statement stat, Connection conn) { 34 if (rs != null) { 35 try { 36 rs.close(); 37 } catch (SQLException e) { 38 e.printStackTrace(); 39 } 40 } 41 if (stat != null) { 42 try { 43 stat.close(); 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 } 47 } 48 if (conn != null) { 49 try { 50 conn.close();// 連接池已經重寫類該方法,該方法是將連接重新放回到連接池 51 } catch (SQLException e) { 52 e.printStackTrace(); 53 } 54 } 55 } 56 }
④使用工具類
1 import java.sql.Connection; 2 import java.sql.PreparedStatement; 3 4 public class TestDemo01 { 5 public static void main(String[] args) throws Exception { 6 //1:獲取連接 7 Connection conn = MyC3P0Utils.getConnetion(); 8 //2:執行sql 9 PreparedStatement stat = conn.prepareStatement("delete from category where cid = ?"); 10 stat.setObject(1, 2); 11 int rows = stat.executeUpdate(); 12 13 //3:處理結果 14 if(rows > 0){ 15 System.out.println("刪除成功"); 16 }else{ 17 System.out.println("刪除失敗"); 18 } 19 20 //4: 釋放資源 21 MyC3P0Utils.closeAll(null, stat, conn); 22 } 23 }