有了jdbc为什么还需要连接池?

  1. 获取数据库连接需要消耗比较多的资源,而每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,
    而数据库创建连接通常需要消耗相对较多的资源,创建时间也较长。而数据库连接对象的使用率低。
  2. 假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出

c3p0连接池使用方式:

1.导入jar包,c3p0jar包符和辅助包
2.书写配置文件 c3p0-config.xml名称固定,放的位置固定,放在src目录
配置文件固定写法如下:

   <c3p0-config>
    <!-- 使用默认的配置读取连接池对象 -->
    <default-config>
        <!--  1. 数据库的连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///jdbctest</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <!-- 2. 连接池参数 -->
        <!--初始连接数-->
        <property name="initialPoolSize">5</property>
        <!--最大连接数-->
        <property name="maxPoolSize">10</property>
        <!--等待多久以后抛出异常-->
        <property name="checkoutTimeout">2000</property>
    </default-config>

    <!-- 命名配置 -->
    <named-config name="otherc3p0">
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///c3p0test</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">8</property>
        <property name="checkoutTimeout">1000</property>
    </named-config>
</c3p0-config>
 注意:ComboPooledDataSource() 使用无参数的构造方法创建对象,会默认加载的src文件夹下c3p0-config.xml文件,并且
       会默认读取default-config下的配置信息。
       
       ConboPooledDataSource(命名配置) 使用的这个带参数的构造方法,可以将named-config name="otherc3p0"中的name
       传递进去,可以创建对应的连接池
       
多个配置方案的好处:

        1. 可以连接不同的数据库,如:jdbctest,c3p0test
        2. 可以连接不同厂商的数据库,如:mysql,oracle
        3. 可以指定不同的连接池参数
   

3.创建对象 ComboPooledDataSource 对象 可以获取一个数据源,这个数据连接池中可以在配置文件中配置开始
创建多少个连接池对象,也就是一个连接池中中有多个连接对象
4.然后可以使用datasource.getConnection();获取一个连接。

Druid连接池

1.导入jar包,一个jar包
2.书写配置文件,配置文件是properties文件,这个文件的名称随便写,位置随便放一般都是放在项目路径下,因为这个配置文件是自己来加载
配置文件写法:

 # 数据库连接参数
 url=jdbc:mysql:///jdbctest
 username=root
 password=root
 driverClassName=com.mysql.jdbc.Driver
 # 连接池的参数
 initialSize=3
 maxActive=10
 maxWait=2000

3.加载配置文件
加载方式:首先创建propeties对象,然后调用load方式,通过流的方式将配置文件加载到内存中即可!

4.得到数据源

类名称 :DruidDataSourceFactory  
可以通过类名称去调用public static DataSource createDataSource(Properties properties)这个方法获取一个dataSource对象

对jdbcUtils的改造:

有了上面的连接池以后,对数据库的操作效率提高,同时一旦封装好类工具类以后,代码量意思大大的减少类,所以现在可以通过连接池对工具类的重新改造!
这个工具类不再是自己通过driverManger获取conn了而是通过连接池来拿取连接

如下:

class jdbcUtils{
/*创建一个数据源对象,并且静态处理,目的是当项目启动时候,创建这个数据源以后,在项目不关闭前提下都不再会创建这个数据源,这个比起每次使用用到
jdbc的时候都要创建一个数据源对象更加节省了内存,同时也大大的方便了调用,操作jdbc更加的方便!*/

//将这个数据源静态化
  private static ComboPooledDateSource ds=new ComboPooledDataSource();

//创建一个公有的数据源获取方法getDataSource

  public static DateSource getDateSource(){
        return ds;
   }

//提供一个getConnnection()方法,下次项目中需要使用到获取连接就直接调用这个方法即可
  public static Connection getConnection(){
       try {
            return cpds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
  }

    //创建释放资源的方法 release()
    //释放资源 释放两个
    public static void release(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }

    //释放资源 释放三个
    public static void release(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        release(stmt, conn); 
    }

}