Druid数据库连接池
- **数据库连接池的基本思想:**就是为数据库连接建立一个”缓存池“。预先在缓存池中存入一定量的连接, 需要建立数据库连接就从“缓存池”
中取出连接,使用完毕以后又放回去
-
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立连接
-
数据库连接池在初始化的时候将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。
无论这些数据库连接是否被使用,连接池都将一直保证至少有这么多的连接数,连接池的最大数据库连接量限定了这个数据库连接池能占有
的最大连接数,当应用程序向连接池请求的连接数据大于最大连接数量时,这些请求将被加入到等待队列中。
-
工作原理
利用德鲁伊德连接池获取数据库连接的步骤
@remark: druid连接池的jar包下载链接:Druid连接池jar包
- 利用Properties文件配置好获取连接需要的属性
url=jdbc:mysql://localhost:3306/fruit?serverTimezone=GMT&allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=utf8
username=root
password=yuyun123
driverClass=com.mysql.cj.jdbc.Driver
maxActive=8
initialSize=8
druid连接池不止上边的属性,比如maxActive(最大连接数),具体的可以自行百度
- 编写JdbcUtils类,负责通过德鲁伊得连接池获取连接
package Utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.DbUtils;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
/**
* @ClassName : JdbcUtils
* @Author : YuYun
* @Date : 2022-04-10 09:56:05
* @Description :负责利用数据库连接池来获取数据库连接,也负责关闭数据库连接
*/
public class JdbcUtils {
static private DataSource dataSource;
// 把加载数据库连接池的功能放到静态代码块中,因为加载数据库连接池只需要加载一次
static{
try {
// 加载properties文件
Properties properties = new Properties();
InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(is);
// 利用拿到的properties资源,加载连接池
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Description : 获取连接
* @Author : YuYun
* @Date : 2022/4/19
*/
public static Connection getConnection() throws Exception {
// 利用连接池获取连接
return dataSource.getConnection();
}
/**
* @Description : 关闭连接
* @Author : YuYun
* @Date : 2022/4/19
*/
public static void closeResource(Connection connection, PreparedStatement preparedStatement){
DbUtils.closeQuietly(connection);
DbUtils.closeQuietly(preparedStatement);
}
public static void closeResource(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
DbUtils.closeQuietly(connection, preparedStatement, resultSet);
}
}
@remark:在MVC的编程模式中,获取连接并不会在Dao层考虑, 有可能会将获取连接提前到Filter层中,方式也会和上边的写法有所出入