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