数据库连接池

Posted lq123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池相关的知识,希望对你有一定的参考价值。

数据库连接池

  1. 数据库的连接对象创建工作,比较消耗性能。

2.一开始现在内存中开辟一块空间(集合) , 一开先往池子里面放置 多个连接对象。 后面需要连接的话,直接从池子里面去。不要去自己创建连接了。 使用完毕, 要记得归还连接。确保连接对象能循环利用。

技术分享图片

自定义数据库连接池

  • 代码实现

  • 出现的问题:

    1. 需要额外记住 addBack方法

    2. 单例。

    3. 无法面向接口编程。

      UserDao dao = new UserDaoImpl();
      dao.insert();

      DataSource dataSource = new MyDataSource();

      因为接口里面没有定义addBack方法。

    4. 怎么解决? 以addBack 为切入点。

解决自定义数据库连接池出现的问题。

由于多了一个addBack 方法,所以使用这个连接池的地方,需要额外记住这个方法,并且还不能面向接口编程。

我们打算修改接口中的那个close方法。 原来的Connection对象的close方法,是真的关闭连接。
打算修改这个close方法,以后在调用close, 并不是真的关闭,而是归还连接对象。

如何扩展某一个方法?

原有的方法逻辑,不是我们想要的。 想修改自己的逻辑

  1. 直接改源码 无法实现。

  2. 继承, 必须得知道这个接口的具体实现是谁。

  3. 使用装饰者模式。

开源连接池

DBCP

  1. 导入jar文件

  2. 不使用配置文件:

     public void testDBCP01(){
    
    
         Connection conn = null;
         PreparedStatement ps = null;
         try {
    
             //1. 构建数据源对象
             BasicDataSource dataSource = new BasicDataSource();
             //连的是什么类型的数据库, 访问的是哪个数据库 , 用户名, 密码。。
             //jdbc:mysql://localhost/bank 主协议:子协议 ://本地/数据库
             dataSource.setDriverClassName("com.mysql.jdbc.Driver");
             dataSource.setUrl("jdbc:mysql://localhost/bank");
             dataSource.setUsername("root");
             dataSource.setPassword("root");
    
    
             //2. 得到连接对象
             conn = dataSource.getConnection();
             String sql = "insert into account values(null , ? , ?)";
             ps = conn.prepareStatement(sql);
             ps.setString(1, "admin");
             ps.setInt(2, 1000);
    
             ps.executeUpdate();
    
         } catch (SQLException e) {
             e.printStackTrace();
         }finally {
             JDBCUtil.release(conn, ps);
         }
    
     }
  3. 使用配置文件方式:

     Connection conn = null;
     PreparedStatement ps = null;
     try {
         BasicDataSourceFactory factory = new BasicDataSourceFactory();
         Properties properties = new Properties();
         InputStream is = new FileInputStream("src//dbcpconfig.properties");
         properties.load(is);
         DataSource dataSource = factory.createDataSource(properties);
    
         //2. 得到连接对象
         conn = dataSource.getConnection();
         String sql = "insert into account values(null , ? , ?)";
         ps = conn.prepareStatement(sql);
         ps.setString(1, "liangchaowei");
         ps.setInt(2, 100);
    
         ps.executeUpdate();
    
     } catch (Exception e) {
         e.printStackTrace();
     }finally {
         JDBCUtil.release(conn, ps);
     }
  • C3P0

拷贝jar文件 到 lib目录

不使用配置文件方式

    Connection conn = null;
    PreparedStatement ps = null;
    try {
        //1. 创建datasource
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //2. 设置连接数据的信息
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        
        //忘记了---> 去以前的代码 ---> jdbc的文档
        dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        
        //2. 得到连接对象
        conn = dataSource.getConnection();
        String sql = "insert into account values(null , ? , ?)";
        ps = conn.prepareStatement(sql);
        ps.setString(1, "admi234n");
        ps.setInt(2, 103200);
        
        ps.executeUpdate();
        
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        JDBCUtil.release(conn, ps);
    }

使用配置文件方式

        //默认会找 xml 中的 default-config 分支。 
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //2. 设置连接数据的信息
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        

        //忘记了---> 去以前的代码 ---> jdbc的文档
        dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        
        //2. 得到连接对象
        conn = dataSource.getConnection();
        String sql = "insert into account values(null , ? , ?)";
        ps = conn.prepareStatement(sql);
        ps.setString(1, "admi234n");
        ps.setInt(2, 103200);


以上是关于数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

连接池报错 Proxool Provider unable to load JAXP configurator file: proxool.xml

MySQL与Redis数据库连接池介绍(图示+源码+代码演示)

稳定性 耗时 监控原因分析-- dubbo rpc 框架 的线程池,io 连接模型. 客户端,服务端

基于UniDac的数据库连接池

数据库连接池的Java连接池