java学习笔记之数据库连接池(DBCP和C3P0)

2018-01-04 08:14:30来源:cnblogs.com作者:猿上生活人点击

分享
第七城市th7cn

数据库连接池(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.Driverurl=jdbc:mysql://localhost:3306/day05dbusername=rootpassword=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  *      BasicDataSource14  *      BasicDataSourceFactory15  * 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 block47             e.printStackTrace();48         }49         50     }51     /**52      * 创建一个静态方法 ,可以让外界获取连接对象53      * @return  Connection 54      * @throws Exception55      */56     public static Connection  getConnection() throws Exception{57         return dataSource.getConnection();58     }59     /**60      * 61      * @param rs 结果集对象,没有写null62      * @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 block72                 e.printStackTrace();73             }74         }75         if(stat!=null){76             try {77                 stat.close();78             } catch (SQLException e) {79                 // TODO Auto-generated catch block80                 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 block90                 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属性:driverClass10       2:进行字符串拼接:setDriverClass11       3: 反射setDriverClass()12       4: 调用setDriverClass()给变量赋值:com.mysql.jdbc.Driver13  -->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.xml18      * 2: 如果没有c3p0-config.xml19      *    你需要手动的设置四大信息20      * 3: 如果有c3p0-config.xml21      *    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 }
第七城市th7cn

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台