數據庫學習--數據庫連接池

數據庫連接池

概念

一個容器(集合),存放數據庫連接的容器。

當系統初始化好後,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,從容器中獲取連接對象,用戶訪問完之後,會將連接對象歸還給容器。

好處

  1. 節約資源

  2. 用戶訪問高效

實現

標準接口

javax.sql包下的DataSource接口

方法:

  • 獲取連接:getConnection()
  • 歸還連接:Connection.close()。

如果連接對象Connection是從連接池中獲取的,那麼調用Connection.close()方法,則不會再關閉連接了。而是歸還連接。

數據庫廠商實現

  1. C3P0:數據庫連接池技術

  2. Druid:數據庫連接池實現技術,由阿里巴巴提供的

C3P0:數據庫連接池技術

  • 步驟:
  1. 導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
    * 不要忘記導入數據庫驅動jar包

  2. 定義配置文件:
    * 名稱: c3p0.properties 或者 c3p0-config.xml
    * 路徑:直接將文件放在src目錄下即可。

  3. 創建核心對象 數據庫連接池對象 ComboPooledDataSource

  4. 獲取連接: getConnection

  • 代碼:
 //1.創建數據庫連接池對象
DataSource ds  = new ComboPooledDataSource();
//2. 獲取連接對象
Connection conn = ds.getConnection();

Druid:數據庫連接池實現技術

*步驟:

  1. 導入jar包 druid-1.0.9.jar

  2. 定義配置文件:
    * 是properties形式的
    * 可以叫任意名稱,可以放在任意目錄下

  3. 加載配置文件。Properties

  4. 獲取數據庫連接池對象:通過工廠來來獲取 DruidDataSourceFactory

  5. 獲取連接:getConnection

  • 代碼:
//3.加載配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
 pro.load(is);

//4.獲取連接池對象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);

//5.獲取連接
Connection conn = ds.getConnection();
  1. 定義工具類

  2. 定義一個類 JDBCUtils

  3. 提供靜態代碼塊加載配置文件,初始化連接池對象

  4. 提供方法
    1. 獲取連接方法:通過數據庫連接池獲取連接
    2. 釋放資源
    3. 獲取連接池的方法

  • 代碼:
			public class JDBCUtils {

 				//1.定義成員變量 DataSource
			    private static DataSource ds ;
			
			    static{
			        try {
			            //1.加載配置文件
			            Properties pro = new Properties();
			            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
			            //2.獲取DataSource
			            ds = DruidDataSourceFactory.createDataSource(pro);
			        } catch (IOException e) {
			            e.printStackTrace();
			        } catch (Exception e) {
			            e.printStackTrace();
			        }
			    }
			
			    /**
			     * 獲取連接
			     */
			    public static Connection getConnection() throws SQLException {
			        return ds.getConnection();
			    }
			
			    /**
			     * 釋放資源
			     */
			    public static void close(Statement stmt,Connection conn){
			       /* if(stmt != null){
			            try {
			                stmt.close();
			            } catch (SQLException e) {
			                e.printStackTrace();
			            }
			        }
			
			        if(conn != null){
			            try {
			                conn.close();//歸還連接
			            } catch (SQLException e) {
			                e.printStackTrace();
			            }
			        }*/
			
			       close(null,stmt,conn);
			    }
			
			
			    public static void close(ResultSet rs , Statement stmt, Connection conn){
			
			
			        if(rs != null){
			            try {
			                rs.close();
			            } catch (SQLException e) {
			                e.printStackTrace();
			            }
			        }
			
			
			        if(stmt != null){
			            try {
			                stmt.close();
			            } catch (SQLException e) {
			                e.printStackTrace();
			            }
			        }
			
			        if(conn != null){
			            try {
			                conn.close();//歸還連接
			            } catch (SQLException e) {
			                e.printStackTrace();
			            }
			        }
			    }
			
			    /**
			     * 獲取連接池方法
			     */
			
			    public static DataSource getDataSource(){
			        return  ds;
			    }
			
			}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章