简介

问题所在

  1. 首先,每一次请求都要建立一次数据库连接。
  2. 建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。

  3. 频繁的进行数据库连接操作势必占用很多的系统资源

  4. 对于每一次数据库连接,使用完后都得断开。 否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。
  5. 不能控制被创建的连接对象数 系统资源会被毫无顾及的分配出去

连接池

问题的根源就在于对数据库连接资源的低效管理

对于共享资源,有一个很著名的设计模式: 资源池(resource pool

该模式正是为了解决资源的频繁分配释放所造成的问题

连接池的基本思想就是为数据库连接建立一个缓冲池

  1. 预先在缓冲池中放入一定数量的连接(预先连接好的)
  2. 当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕之后再放回去
  3. 可以通过设定连接池最大连接数来防止系统无尽的与数据库连接
  4. 可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发﹑测试及性能调整提供依据。

代码实现步骤

  1. 编写class 实现DataSource 接口

  2. 在class构造器一次性创建10个连接,将连接保存LinkedList中

  3. 实现getConnection  从 LinkedList中返回一个连接

  4. 提供将连接放回连接池中方法

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

  • 连接池代码       
public class MyDataSource implements DataSource {
       //链表 --- 实现栈结构
       privateLinkedList<Connection> dataSources = new LinkedList<Connection>();

       //初始化连接数量
       publicMyDataSource() {
              //一次性创建10个连接
              for(int i = 0; i < 10; i++) {
                     try {
                            //1、装载sqlserver驱动对象
                            DriverManager.registerDriver(new SQLServerDriver());
                            //2、通过JDBC建立数据库连接
                            Connection con =DriverManager.getConnection(
                            "jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
                            //3、将连接加入连接池中
                            dataSources.add(con);
                     } catch (Exception e) {
                            e.printStackTrace();
                     }
              }
       }

       @Override
       publicConnection getConnection() throws SQLException {
              //取出连接池中一个连接
              finalConnection conn = dataSources.removeFirst(); // 删除第一个连接返回
              returnconn;
       }

       //将连接放回连接池
       publicvoid releaseConnection(Connection conn) {
              dataSources.add(conn);
              }
}

  • 使用连接池重构用户查询函数       
       //查询所有用户
Public void FindAllUsers(){
       //1、使用连接池建立数据库连接
       MyDataSource dataSource = new MyDataSource();
       Connection conn =dataSource.getConnection();        
       //2、创建状态
       Statement state =con.createStatement();           
       //3、查询数据库并返回结果
       ResultSet result =state.executeQuery("select * from users");           
       //4、输出查询结果
       while(result.next()){
              System.out.println(result.getString("email"));
       }            
       //5、断开数据库连接
       result.close();
       state.close();
       //6、归还数据库连接给连接池
       dataSource.releaseConnection(conn);
}