Connection是一种稀有资源,一个连接建立就创造了一个资源。
举个例子:
QQ连接上了,我的QQ和腾讯的服务器建立了一个连接,有代价,因为需要远程的去连接,所以说连接是一个很宝贵的资源,如果同时在线人数很多就有可能导致服务器崩溃。
所以就有两种情况(解决方案):
第一种:我一个人玩(我自己一个服务器),那肯定不会崩溃。
第二种:把服务器的人数限定一下,限定10000个人,最多不超过10000人,第10001个人上线,就需要排队。
那我们使用JDBC到时候是必须要使用连接池的:
JDBC使用数据库连接池的必要性:
在使用基于web程序的数据库的连接,在主程序中建立连接,执行sql,断开连接
所有的JDBC连接通过DriverManager.Connection连接.
我们用完的连接不要被垃圾回收,能够重复使用
所以需要“池化思想”
我们每次去初始化一个连接池,连接池中会有很多个连接在等待被使用。
使用完连接之后,也不需要关闭连接,只需要把连接还回到连接池。
还回到连接池的操作还不需要我们手动控制。
初始化连接池,10条连接,来了20个请求,10个请求就直接拿走10条连接去进行操作,剩下的10个请求,有两种方式:一:等待前面10个请求结束,拿来用。二:我再向服务器申请连接数。
连接池的数据池:
(1)C3P0:二代数据库连接池,太老了,不学
(2)DBCP:二代数据库连接池,太老了,不学
(3)Druid:(德鲁伊)数据库连接池,现在市面上最好用的连接池。
阿里巴巴开源平台上的一个数据库连接池的实现,整合了C3P0和DBCP各自的优点
加入了日志监控,可以监控sql语句的执行情况
(4)Hikari(光),目前最快的连接池。springboot默认的连接池。
用数据池的前提:必须要有对应的属性文件和导入jar包
.properties文件
约定 > 配置 > 编码
例如:德鲁伊数据库连接池
druid.properties文件:(和之前写的jdbc.properties文件里的内容不一样)需要把mysql改成druid:
- druid.url=jdbc:mysql://127.0.0.1:3306/wy?useUnicode=true&characterEncoding=utf8
- druid.username=root
- druid.password=root
- druid.driverName=com.mysql.jdbc.Driver
-
- druid.initialSize=10//初始化链接数
- druid.maxActive=20//最大连接数
- druid.maxWait=20//获取连接最大等待时间
在方法中:
- Properties properties = new Properties(); properties.load(Ch01.class.getClassLoader().getResourceAsStream("druid.properties"));
- //创建一个properties对象,拿到文件信息,加载到对象当中。
- //之后创建一个德鲁伊文件数据源:
- DruidDataSource druidDataSource = new DruidDataSource();
- //直接加载属性文件
- druidDataSource.configFromPropety(properties);
- //从数据库连接池中拿连接
- druidDataSource.getConnection();
HikariConfig光数据库连接池:
hikari.properties文件:
- jdbcUrl=jdbc:mysql://127.0.0.1:3306/wy?useUnicode=true&characterEncoding=utf8
- username=root
- password=020323
- driverClassName=com.mysql.jdbc.Driver
方法调用:
- Properties properties = new Properties();
- properties.load(Ch01.class.getClassLoader().getResourceAsStream("hikari.properties"));
-
- HikariConfig hikariConfig = new HikariConfig(properties);
- HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
-
- hikariDataSource.getConnection();
利用数据库连接池(德鲁伊)做一个工具类(操作数据源)
java提供的一个标准接口:DataSource
目的:为了获取数据源(不用写那些文件等),再去获取连接,连接不需要关闭
- public class BaseDao {
- public static final DataSource DATA_SOURCE;
- static {
- Properties properties = new Properties();
- try { properties.load(Ch01.class.getClassLoader().getResourceAsStream("druid.properties"));
- // 创建德鲁伊的数据源,德鲁伊提供的一个静态方法
- DATA_SOURCE = DruidDataSourceFactory.createDataSource(properties);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- public static void closeAll(Statement stmt, ResultSet rs) {
- if(Objects.nonNull(stmt)) {
- try {
- stmt.close();
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }
- }
- if(Objects.nonNull(rs)){
- try {
- rs.close();
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }
我简要说明一个东东,因为博主也不是很理解,所以写的不对,请大家矫正:
我们未来写项目的时候,会使用封装的思想,采用接口的形式,把一个一个类共同的连接方法通过接口的方式完成eg:

有Teacher类和User类封装基础属性,然后之前我们的方式是通过XXXDao来写关于自己本类的方法,但是现在我们可以通过IBaseDao接口设置基础方法,再通过BaseDaoImpl实现接口补全方法内容,之后XXXDao继承BaseDaoImpl,这样我们不需要再XXXDao里面写方法,就可以调用连接。由于代码过多,我就不写了,有需要的可以私信我。
DBUtils:
使用的是一个类:QueryRunner:
类传入的是数据源DataSource,不是一个Connection
- QueryRunner runner = new QueryRunner(BaseDao.DATA_SOURCE);
-
- //修改
- runner.update("update teacher set name = ? where id = ?", "mmm", 6);
- runner.query("select * from 表名 where id = ?",new BeanHandler<>(类名.class),1);
- //查询一个
- runner.query("",new BeanHandler)
- //查询所有
- runner.query("sql语句",new BeanListHandler<>(类名.class));