四種鏈接數據庫的方法(DriverManager、DataSource子類、DBCP、c3p0)
1、環境
一、數據庫驅動jar文件 java
二、DBCP方法
Commons-dbcp.jar:鏈接池的實現 Commons-pool.jar:鏈接池實現的依賴庫 資源文件
三、c3p0方法: c3p0-0.9.1.2.jar
配置文件:c3p0-config.xml 2、鏈接操做 1.DriverManager方法; import java.sql.Connection;
mysql
package demo.jdbcpool.test1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConnection { private static String driverClass = "com.mysql.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/test"; private static String username = "root"; private static String password = "123456"; private static Connection conn = null; static { try { // 註冊驅動 // 不要把conn = DriverManager.getConnection(url, username, password); // 放在這裏。防止全部用戶都用一個Connection Class.forName(driverClass); } catch (Exception e) { throw new RuntimeException(e); } } public static Connection getConnection() throws SQLException { conn = DriverManager.getConnection(url, username, password); return conn; } }
2.使用DataSource子類方法; sql
資源文件DBConnection.properties 數據庫
driverClass = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/test username = root password = 123456
模擬數據鏈接池 oracle
DataSourcePool.java package cn.langzi.jdbc.DataSource; import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList; import java.util.Properties; import javax.sql.DataSource; import javax.sql.DataSource; public class DataSourcePool implements DataSource { private static String url = null; private static String username = null; private static String password = null; private static int size = 10; private static LinkedList<Connection> list = new LinkedList<Connection>(); static{ try { InputStream in = DataSourcePool.class.getClassLoader() .getResourceAsStream ("cn/langzi/jdbc/DataSource/DBConnection.properties"); Properties prop = new Properties(); prop.load(in); Class.forName(prop.getProperty("driverClass")); url = prop.getProperty("url"); username = prop.getProperty("username"); password = prop.getProperty("password"); } catch (Exception e) { throw new ExceptionInInitializerError(e); } } private static DataSourcePool pool = new DataSourcePool(); //建立對象就初始化size個數據庫鏈接 private DataSourcePool(){ for(int i=0;i<size;i++){ try { Connection conn = DriverManager.getConnection(url, username, password); System.out.println(conn); list.add(conn); } catch (SQLException e) { e.printStackTrace(); } }
DataSource有兩種實現方式url
1.直連數據庫方式
1.當調用DataSource.getConnection()時,其實它調用的是DriverManager.getConnection(url, user, password)來獲取一個Connection,Connection使用完後被close,斷開與數據庫的鏈接,咱們稱這總方式是直連數據庫,由於每次都須要從新創建與數據庫之間的鏈接,而並無把以前的Connection保留供下次使用.code
2.池化鏈接方式
1.能夠說這種方式就是使用了鏈接池技術.DataSource內部封裝了一個鏈接池,當你獲取DataSource的時候,它已經敲敲的與數據庫創建了多個Connection,並將這些Connection放入了鏈接池,此時調用DataSource.getConnection()它從鏈接池裏取一個Connection返回,Connection使用完後被close,但這個close並非真正的與數據庫斷開鏈接,而是告訴鏈接池"我"已經被使用完,"你"能夠把我分配給其它"人"使用了.就這樣鏈接池裏的Connection被循環利用,避免了每次獲取Connection時從新去鏈接數據庫.
對DataSource的兩種實現方式已經介紹完畢,如今知道DataSource與鏈接池之間的是關係而不是區別了吧,由於DataSource與鏈接池根本就不是同一類型的東西,只有同一類型的東西才存在區別,例如:oracle與db2都是數據庫,它們才存在區別.xml
咱們這裏僅僅實現了數據庫的連接,並無池化連接對象