dbcp数据库连接池需要的jar包:https://pan.baidu.com/s/1i4PiWCl
1、数据库连接基础
数据库连接池基础主要包括以下三个方面的内容:数据库连接池的基本概念、数据库连接池的工作原理、Java开源的连接池。
(1)数据库连接池的基本概念
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的Web应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。因此,数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个数据库连接;释放空闲时间超过最大空闲时间的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保持至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数时,这些请求将被加入到等待队列中。
(2)数据库连接池的工作原理
下面请看一个具体的数据库连接池工作原理示意图:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/login?useSSL=false
username=root
password=12345
maxActive=5
(3)Java开源的连接池
由于Java的开源特性,产生了许多Java开源的连接池。例如以下数据库连接池:Jakarta DBCP、C3P0、Proxool、DBPool等。
其中,Jakarta DBCP具体是:一个依赖Jakarta commons-pool对象池的数据库连接池,DBCP可以直接第在应用程序中使用。这也是本文所要介绍的技术要点。
C3P0具体是:一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection池和Statement池的DataSources对象。
(4)如何连接:
创建dbcp properties:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/login?useSSL=false
username=root
password=12345
maxActive=5
创建DataSourceUtil
public class DataSourceUtils {
private static DataSource ds;
static{
InputStream in=DataSourceUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties properties=new Properties();
try {
properties.load(in);
ds=new BasicDataSourceFactory().createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return ds;
}
}
创建dao实现类使用DataSourceUtil
package com.lrq.dao.daoImpl;
import com.lrq.dao.UserDao;
import com.lrq.entity.User;
import com.lrq.util.DataSourceUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class UserDaoImpl implements UserDao {
@Override
public boolean add(User user){
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "insert into user(name,pwd) values(?,?)";
int rs= 0;
try {
rs = qr.update(sql,"sss","345");
} catch (SQLException e) {
e.printStackTrace();
}
if(rs>0){
return true;
}else {
return false;
}
}
@Override
public List<User> queryAll() {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user";
List<User> list=null;
try {
list=qr.query(sql,new BeanListHandler<User>(User.class));
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
@Override
public User queryByName(String na) {
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user where name=?";
User user= null;
try {
user = qr.query(sql,new BeanHandler<User>(User.class),na);
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
@Override
public User query(String na, String pwd){
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user where name=? and pwd=?";
User user= null;
try {
user = qr.query(sql,new BeanHandler<User>(User.class),na,pwd);
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
@Override
public boolean updateUser(User user){
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "update user set pwd=? where name=?";
int rs= 0;
try {
rs = qr.update(sql,user.getPassWord(),user.getUsername());
} catch (SQLException e) {
e.printStackTrace();
}
if(rs>0){
return true;
}else {
return false;
}
}
@Override
public boolean deleteUser(User user){
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "delete from user where name=?";
int rs= 0;
try {
rs = qr.update(sql,user.getUsername());
} catch (SQLException e) {
e.printStackTrace();
}
if(rs>0){
return true;
}else {
return false;
}
}
}