在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:
- 在主程序建立数据库连接
- 进行sql操作
- 断开数据库连接
这种模式,存在以下问题:
- 每次连接数据库需要建立连接,执行完再断开连接,会消耗大量的资源和时间,数据库的连接资源并没有得到很好的重复利用。
- 对于每一次数据库连接,使用完都得断开。否则,如果程序出现异常为关闭,将导致数据库系统内存泄漏。
- 这种开发不能控制被创建的连接对象数,系统资源会被毫不顾忌的分配出去。
一、数据库连接技术
- 为解决传统开发数据库连接问题,可采用连接池技术
- 基本思想:为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用完再放回去。
- 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
- 数据库连接的数量由最小数据库连接数设定,最大数据库连接数量限定能占有的最大连接数,最大最小连接数在连接数据库时设定,当请求连接数超过最大连接数量,这些请求将被加入到等待队列中。
二、Druid(德鲁伊)
数据库连接池开源组织实现有很多,这里使用Druid,也是开发中常用的一种;
Druid是阿里提供的数据库连接池,集DBCP、C3P0、Proxool优点于一身的数据库连接池;
下面使用idea+mysql8实现。
代码实现
1、加载驱动
将驱动文件复制到lib文件下并添加为库。
2、创建配置文件druid.properties
封装连接数据库的基本信息
url=jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
username=root
password=ad
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=7
maxActive=10
详细配置参数
配置 | 说明 |
name | 如果存在多个数据源,监控的时候可以通过名字区分,如果没有配置,会生成一个名字,格式:“DataSource”+System.identityHashCode(this) |
url | 连接数据库的url |
username | 连接数据库的用户名 |
password | 连接数据库的密码 |
driverClassName | 可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName(建议配置下) |
initialSize | 初始化时建立物理连接的个数 |
maxActive | 最大连接池数量 |
3、连接数据库
方式一
public static void getConnection() throws Exception{
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
DataSource source = DruidDataSourceFactory.createDataSource(pros);
Connection conn = source.getConnection();
System.out.println(conn);
}
方式二(优化)
创建JDBCUtils类
用于封装连接数据库方法
/**Druid数据库连接池技术*/
private static DataSource source;
static {
try {
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
source = DruidDataSourceFactory.createDataSource(pros);
}catch (Exception e){
e.printStackTrace();
}
}
public static Connection getConnection1() throws SQLException{
Connection conn = source.getConnection();
return conn;
}
4、测试
/**使用druid连接池*/
void getCustomerById() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection1();
Customer cust = dao.getCustomerById(conn,19);
System.out.println(cust);
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtils.closeResource(conn,null);
}
}