前言
我们在写任何一个CRUD方法的时候都要进行即连接数据库和释放资源这两个操作。DAO层方法中每次都创建一个Connection对象,用完就关闭了,创建Connection成本很大,如何解决这个问题呢?
每次CRUD操作都要使用数据库的时候,都要创建一个数据库对象,普通的JDBC数据库连接使用DriverManager来获取,每次向数据库连接的时候都要将Connection加载到内容中,然后再验证用户名和密码花费时间约1s左右,每次CRUD操作就向数据库要一个连接,执行完成后再断开连接,这样的方式存在几个问题:
- 将会消耗大量的资源和时间
- 数据库的连接资源并没有得到很好的重复利用
- 若同时有个几百人在线呢,性能极差
- 频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器崩溃
一、数据库连接池
数据库连接池,就是保存数据库连接对象的容器。可以初始化时创建一定数量的对象。需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次有对象请求可以直接复用。池技术的优势是,可以消除对象创建所带来的延迟,从而提高系统的性能。
二、常见的连接池
C3P0、DBCP和Druid三种开源数据库连接池的特性、配置及优缺点。C3P0以其稳定性著称,DBCP是Tomcat默认的连接池,而Druid则结合多种连接池优点并提供监控功能。通过配置文件管理连接池参数,可以提高系统响应速度和资源利用率,防止内存泄漏,确保数据库连接的高效管理。
三、使用方法
封装JDBCUtils工具类:
private static DataSource dataSource;
static {
Properties properties = new Properties();
//加载资源文件
InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
try {
properties.load(resourceAsStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//获取数据源
public static DataSource getDataSource(){
return dataSource;
}
获取连接方式:
public void test() throws Exception {
Connection connection = JDBCUtils.getConnection();
String sql = "select * from province";
PreparedStatement pst = connection.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
Province pro;
List<Province> list = new ArrayList();
while (rs.next()) {
pro = new Province();
pro.setId(rs.getInt(1));
pro.setName(rs.getString(2));
list.add(pro);
}
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(list);
System.out.println(s);
JDBCUtils.close(rs,pst,connection);
}
配置文件:
创建一个名为druid.properties的文件,放在src目录下
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/testdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8
username=root
password=数据库密码
#初始化连接数
initialPoolSize=10
#最小连接数
minIdle=5
#最大连接
maxActive=20
# 超时时间,以毫秒为单位,1000毫秒==1秒
maxWait=3000
四、数据库连接池技术
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”与现在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕之后再放回去。
我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接,可以通过连接池的管理机制监视数据库的连接的数量和使用情况,为系统开发,测试及性能调整提供依据。
另外注意:
DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池。DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。
数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。当数据库访问结束后,程序还是像以前一样关闭数据库连接:JDBCUtils.close(); 但它并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
标签:JDBC,数据库,properties,Connection,JDBCUtils,连接,连接池 From: https://blog.csdn.net/Ioc_beans/article/details/142623238