1. JDBC连接池

1.1 JDBC连接池简介

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



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



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

1.2 JDBC连接池接口:

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

    * HikariCP

    * C3P0

    * BoneCP

    * Druid

1.3 以HiKariCP为例

导入依赖

<!-- 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);
}
}
}

2. 总结

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

  • 可以复用Connection,避免反复创建新连接,提高运行效率
  • 可以配置连接池的详细参数

廖雪峰Java15JDBC编程-3JDBC接口-5JDBC连接池的更多相关文章

  1. 廖雪峰Java15JDBC编程-3JDBC接口-1JDBC简介

    JDBC:Java DataBase Connectivity Java程序访问数据库的标准接口 使用Java程序访问数据库的时候,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接 ...

  2. 廖雪峰Java15JDBC编程-3JDBC接口-4JDBC事务

    1 数据库事务:Transaction 1.1 定义 若干SQL语句构成的一个操作序列 要么全部执行成功 要么全部执行不成功 1.2 数据库事务具有ACID特性: Atomicity:原子性 一个事务 ...

  3. 廖雪峰Java15JDBC编程-3JDBC接口-3JDBC更新

    使用update语句的时候,需要通过JDBC实现update语句的执行,这个时候仍然通过PreparedStatement对象来使用,直接传入update语句,然后通过setObject传入占位符的值 ...

  4. 廖雪峰Java15JDBC编程-3JDBC接口-2JDBC查询

    我们可以使用JDBC查询来执行select语句. 1. Statement try(Connection conn = DriverManager.getConnection(JDBC_URL, JD ...

  5. 廖雪峰Java15JDBC编程-2SQL入门-2insert/select/update/delete

    1. INSERT用于向数据库的表中插入1条记录 insert into 表名 (字段1,字段2,...) values (数据1,数据2,数据3...) 示例 -- 如果表存在,就删除 drop t ...

  6. 廖雪峰Java15JDBC编程-2SQL入门-1SQL介绍

    1.SQL:结构化查询语言 Structured Query Language 针对关系数据库设计 各种数据库基本一致 允许用户通过SQL查询数据而不关心数据库底层存储结构 1.1 SQL使用: 可以 ...

  7. 廖雪峰Java15JDBC编程-1关系数据库基础-1关系数据库简介

    1.数据库 1.1 定义 数据库是按照数据结构来组合.存储和管理数据的软件. 1.2 数据库模型 数据库有层次模型.网状模型.关系模型三种模型. 2 关系数据库 关系数据库是建立在关系模型上的数据库, ...

  8. 廖雪峰Java6IO编程-1IO基础-1IO简介

    1.IO简介 IO是指Input/Output,即输入和输出: Input指从外部读取数据到内存,例如从磁盘读取,从网络读取. * 为什么要把数据读到内存才能处理这些数据呢? * 因为代码是在内存中运 ...

  9. 廖雪峰Java6IO编程-2input和output-1inputStream

    1.InputStream 1.1InputStream是所有输入流的超类: int read() * 读取下一个字节,并返回字节(0-255) * 如果已读到末尾,返回-1 * read()方法是阻 ...

随机推荐

  1. hdu6395 /// 分块矩阵快速幂

    题目大意: F(1)=A, F(2)=B,  F(i)=C*F(i-2)+D*F(i-1)+p/i(向下取整) 给定A B C D p n 求F(n) 构造 矩阵A *   矩阵B        =  ...

  2. Android的WebView通过JS调用java代码

    做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录 ...

  3. pyJWT

    现在用JWT 加密太火了,怎么能不跟上潮流?否则销售都不好意思出去吹牛逼! PyJWT是一个Python库,用来编码/解码JWT(JSON Web Token)的 1.定义:根据维基百科的定义,JSO ...

  4. echart 柱状图背景色设置

    方法一: series: [ { name: '1', type: 'bar', itemStyle: {//柱图背景色 color: '#111' }, data: list }, { name: ...

  5. canvas-nest.js 设置网页背景

    只需要在HTML,body中加如这行代码就可以实现效果,可以在color中修改颜色 <!DOCTYPE html> <html> <head> <meta c ...

  6. ps去除元素的三种常用方法

    1.仿制图章工具,alt+鼠标左键进行选取复制区域,然后左键点击需要覆盖的区域. 2.套锁工具--选择区域--右键填充--内容识别.     3.修补工具,选中区域--拖动适配.     附带另一份较 ...

  7. StringUtils工具类常用api <转>

    该工具类是用于操作Java.lang.String类的. StringUtils类与String类的区别在于:此类是null安全的,即如果输入参数String为null,则不会抛出NullPointe ...

  8. 2019.7.3模拟 七星连珠(行列式+随机+k进制FWT)

    题目大意: 给一个\(n*n\)的矩阵,对于所有排列p,记录\(a[i][p[i]]\)的k进制下不进位加法的结果,问所有被记录过的数. \(n<=50,p=2.3,0<=a[i][j]& ...

  9. 「题解」:x

    问题 A: x 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 赛时想到了正解并且对拍了很久.对拍没挂,但是评测姬表示我w0了……一脸懵逼. 不难证明,如果对于两个数字 ...

  10. 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线

    题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...