廖雪峰Java15JDBC编程-3JDBC接口-5JDBC连接池

匿名 (未验证) 提交于 2019-12-02 21:52:03

线程池可以复用一个线程,这样大量的小任务通过线程池的线程执行,就可以避免反复创建线程带来的开销。

同样JDBC可以复用一个JDBC连接

JDBC的连接池可以维护若干个JDBC连接,在执行数据库任务的时候,可以从连接池中直接获取连接,而不是反复创建和关闭JDBC连接

  • javax.sql.DataSource
  • JDK只提供了连接池的定义,所以我们还要实现JDBC的连接池。常用的开源实现:
    * HikariCP
    * C3P0
    * BoneCP
    * Druid

导入依赖

<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP --> <dependency>     <groupId>com.zaxxer</groupId>     <artifactId>HikariCP</artifactId>     <version>3.3.1</version> </dependency> 

演示代码

    HikariConfig config = new HikariConfig();     config.setJdbcUrl("jdbc:mysql://localhost:3306/test");     config.setUsername("root");     config.setPassword("password");     config.addDataSourceProperty("connectionTimeout", "1000"); //连接超时1秒     config.addDataSourceProperty("idleTimeout", "60000"); //空闲连接60秒     config.addDataSourceProperty("maximumPoolSize", "10"); //最大连接数10     DataSource dataSource = new HikariDataSource(config);
package com.feiyangedu.sample.pop3;  import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource;  import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List;  public class JdbcSelect2 {     static final String JDBC_URL = "jdbc:mysql://localhost:13306/test0828?useSSL=false&characterEncoding=utf-8&serverTimeZone=UTC";     static final String JDBC_USER = "root";     static final String JDBC_PASSWORD = "123456";      public static void main(String[] args) throws Exception{         DataSource dataSource = createDataSource();         List<Thread> threads = new ArrayList<>();         for(int i=1;i<=4;i++){             final int classId=i;             Thread t = new Thread(){                 public void run(){                     try{                         Thread.sleep((long)(Math.random()*1000));                     }catch (InterruptedException e){                         e.printStackTrace();                     }                     List<Student> list = getStudentsOfClass(dataSource,classId);                     System.out.println("Students of class: "+classId+";");                     for(Student student:list){                         System.out.println(student);                     }                 }             };             threads.add(t);         }         for(Thread t:threads){             t.start();         }         for(Thread t:threads){             t.join();         }     }     static DataSource createDataSource(){ //创建一个连接池         HikariConfig config = new HikariConfig();         config.setJdbcUrl(JDBC_URL);         config.setUsername(JDBC_USER);         config.setPassword(JDBC_PASSWORD);         config.addDataSourceProperty("connectionTimeout", "1000"); //连接超时:1秒         config.addDataSourceProperty("idleTimeout", "60000"); //空闲超时:60秒         config.addDataSourceProperty("maximumPoolSize", "10"); //最大连接数:10         return new HikariDataSource(config);     }     static List<Student> getStudentsOfClass(DataSource dataSource,long theclassId){         try(Connection conn = dataSource.getConnection()){ //获取Connection对象             System.err.println("Using connection:"+conn);             try(PreparedStatement ps = conn.prepareStatement("select * from students where class_id=?")){                 ps.setObject(1,theclassId);                 try(ResultSet rs = ps.executeQuery()){                     List<Student> list = new ArrayList<>();                     while (rs.next()){                         long id = rs.getLong("id");                         long classId = rs.getLong("class_id");                         String name = rs.getString("name");                         String gender = rs.getString("gender");                         Student std = new Student(id,classId,name,gender);                         list.add(std);                     }                     return list;                 }             }         }catch (SQLException e){             throw new RuntimeException(e);         }     } }

数据库连接池(javax.sql.DataSource):

  • 可以复用Connection,避免反复创建新连接,提高运行效率
  • 可以配置连接池的详细参数
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!