数据库连接池

数据库连接池

连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、

安全的复用,避免了数据库连接频繁建立、关闭的开销。


java提供的连接池接口:javax.sql.DataSource,连接池厂商的连接池类需要实现这一接口。

1、实现DataSource(javax.sql)接口,并实现连接池功能的步骤:

2、在DataSource构造函数中批量创建与数据库的连接(Connection),并把创建的连接保存到一个集合对象中()

创建好连接之后,把连接放到一个集合中。LinkedList.

3、实现getConnection方法,让getConnection方法每次调用时,从集合对象中取一个Connection返回给用户。

4、当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到连接池的集合对象中,而不要把conn还给数据库。

池参数(所有池参数都有默认值)

初始大小:10个

最小空闲连接数:3个

增量:一次创建的最小单位(5个)

最大空闲连接数:12个

最大连接数:20个

最大的等待时间:1000毫秒

四大连接参数

连接池也是使用四大连接参数来完成创建连接对象!

实现的接口

连接池必须实现:javax.sql.DataSource接口!

连接池返回的Connection对象,它的close()方法与众不同!调用它的close()不是关闭,而是把连接归还给池!

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

DBCP

1、整理:

连接池:存储连接的结合。

需要实现javax.sql.datasource.----sun公司要求的。

2、开源连接池。DBCP 她实现了javax.sql.datasource.

       1、getConnection(); 从集合中获取连接。

dbcp 提供的实现类。BasicDataSrouce

需要告诉dbcp的连接数据库参数信息。

       ds.seturl

       ds.setusername

       ds.setpassword      

       ds.setdriverClassName

public class JDBC_DBCP {
    public static void main(String[] args) {
        BasicDataSource ds=new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");//设置驱动
        ds.setUrl("jdbc:mysql://localhost:3306/stu");
        ds.setUsername("root");//设置用户密
        ds.setPassword("123");//设置密码
        /*
         * JDBC六步
         * */
        Connection conn=null;
        PreparedStatement ps=null;
        try {
             conn=ds.getConnection();
             String sql="INSERT INTO student (sname,gender) VALUES(?,?)";
             ps=conn.prepareStatement(sql);
             ps.setString(1, "赵1");
             ps.setInt(2, 22);
             ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //关闭资源
        try {
            ps.close();
            conn.close();
            ds.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }    
    }
}

3、可以通过配置文件的方式,配置数据库的连接参数。

   dbcp要求的连接参数要放入到properties中。

 url=jdbc:mysql://localhost:3306/day08
 username=root
 password=123456
 driverClassName=com.mysql.jdbc.Driver

把properties这个文件,转换为Properties对象给

Properties prop = new Propterties();
prop.load(InputStream is);
BasicDataSrouceFatory.createDataBAse(Propterties prop);

代码:

public class JDBC_DBCP {
    public static void main(String[] args){ 
      
        /*
         * JDBC六步
         * */
        Connection conn=null;
        PreparedStatement ps=null;
        DataSource ds=null;
        try {
            Properties p=new Properties();
            InputStream in=new FileInputStream("src/dbconfig.properties");
            p.load(in);
            ds=BasicDataSourceFactory.createDataSource(p);
             conn=ds.getConnection();
             String sql="INSERT INTO student (sname,gender) VALUES(?,?)";
             ps=conn.prepareStatement(sql);
             ps.setString(1, "赵2");
             ps.setInt(2, 22);
             ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //关闭资源
        try {
            ps.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }    
    }
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

C3P0

手动配置

jar:c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setUser("root");
ds.setPassword("123");
ds.setDriverClass("com.mysql.jdbc.Driver");
   
ds.setAcquireIncrement(5) ;/*每次增加五*/
ds.setInitialPoolSize(20) ;//初始化连接数
ds.setMinPoolSize(2) ;//最少连接
ds.setMaxPoolSize(50) ;//最多连接
  
Connection con = ds.getConnection();

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

C3P0配置文件

1. 通过默认配置初始化连接池

配置文件要求:

文件名称:必须叫c3p0-config.xml

文件位置:必须在src下

<default-config>
  <property name="xxx">XXX</property>
</defualt-config>

2. 通过命名配置初始化连接池

<named-config name="orcale-config">
  <property name="xxx">XXX</property>
</named-config>

    /**
     * 配置文件的默认配置
     * @throws SQLException 
     */
    @Test
    public void fun2() throws SQLException{
        /**
         * 在创建连接池对象时,这个对象就会自动加载配置文件!不用我们来指定
         */
        ComboPooledDataSource dataSource  = new ComboPooledDataSource();
        
        Connection con = dataSource.getConnection();
        System.out.println(con);
        con.close();
    }
    
    /**
     * 使用命名配置信息
     * @throws SQLException
     */
    @Test
    public void fun3() throws SQLException{
        /**
         * 构造器的参数指定命名配置元素的名称!
         * <named-config name="oracle-config"> 
         */
        ComboPooledDataSource dataSource  = new ComboPooledDataSource("oracle-config");
        
        Connection con = dataSource.getConnection();
        System.out.println(con);
        con.close();
    }
}

修改JdbcUtils

public class JdbcUtils {
 private static DataSource dataSource = new ComboPooledDataSource();
 public static DataSource getDataSource() {
  return dataSource;
 }
 public static Connection getConnection() {
  try {
   return dataSource.getConnection();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}
原文地址:https://www.cnblogs.com/lxp503238/p/6640508.html