数据库连接池
1. 数据库连接池与JDBC对比
连接池是数据库的技术
JDBC每个用户请求都要创建新的连接对象,使用完要销户,多用户同时访问时会频繁创建和销毁连接对象,内存销毁大;
而连接池初始化时初始化一批数据库连接对象,用完归还到连接池,实现连接对象的复用,不够创建新的一批连接对象,达到最大连接数时,等待请求释放归还到连接池中
2. 数据库连接池的使用
2.1 导包
去maven网站搜索所需的连接池,复制代码,去项目的pom.xml文件导入依赖即可
2.2 使用
2.2.1 配置db.properties
db.properties 下增加初始容量和最大容量
initSize = p.getProperty("db.initSize");
maxSize = p.getProperty("db.maxSize");
resources目录下db.properties
db.username=root
db.password=123456
db.url=jdbc:mysql://localhost:3306/citylifefk?characterEncoding=utf8&serverTimezone=UTC
db.driver=com.mysql.jdbc.Driver
db.initSize = 25
db.maxSize = 50
2.2.2 util目录下的DBUtil类
定义6个静态变量,加载一次即可实现共享数据
private static String username;
private static String password;
private static String url;
private static String driver;
private static String initSize;
private static String maxSize
创建连接池对象
private static BasicDataSource basicDataSource;
静态块内容:
static {
try {
InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
// FileInputStream in=new FileInputStream("db.properties");
System.out.println("in:" + in);
//Properties 将properties属性文件数据以k-v的形式加载到内存中
Properties p = new Properties();
//p.load(in)将int类型加载
p.load(in);
//properties里保存到变量中
username = p.getProperty("db.username");
password = p.getProperty("db.password");
url = p.getProperty("db.url");
driver = p.getProperty("db.driver");
initSize = p.getProperty("db.initSize");
maxSize = p.getProperty("db.maxSize");
System.out.println(username);
System.out.println(password);
System.out.println(url);
System.out.println(driver);
} catch (IOException e) {
e.printStackTrace();
}
}
使用 BasicDataSource 方法封装一个获取连接池方法
basicDataSource = new BasicDataSource();
将数据库的参数设置到连接池对象中并返回 basicDataSource
basicDataSource.setDriverClassName(driver);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
basicDataSource.setUrl(url);
basicDataSource.setInitialSize(Integer.parseInt(initSize));
basicDataSource.setMaxActive(Integer.parseInt(maxSize));
return basicDataSource;
通过连接池获取连接对象
//通过连接池获取连接对象
public static Connection getConn(){
Connection connection = null;
try {
connection = DBUtil.getBData().getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
util目录下是DBUtil完整代码:
package util;
/*
连接数据的类
*/
import org.apache.commons.dbcp.BasicDataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtil {
private static String username;
private static String password;
private static String url;
private static String driver;
private static String initSize;
private static String maxSize;
private static BasicDataSource basicDataSource;
static {
try {
InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
// FileInputStream in=new FileInputStream("db.properties");
System.out.println("in:" + in);
Properties p = new Properties();
p.load(in);
username = p.getProperty("db.username");
password = p.getProperty("db.password");
url = p.getProperty("db.url");
driver = p.getProperty("db.driver");
initSize = p.getProperty("db.initSize");
maxSize = p.getProperty("db.maxSize");
System.out.println(username);
System.out.println(password);
System.out.println(url);
System.out.println(driver);
} catch (IOException e) {
e.printStackTrace();
}
}
//封装一个获取连接池的连接方法
public static BasicDataSource getBData() {
basicDataSource = new BasicDataSource();
//将数据库的参数设置到连接池对象中
basicDataSource.setDriverClassName(driver);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
basicDataSource.setUrl(url);
//将字符串转为Integeter类型
basicDataSource.setInitialSize(Integer.parseInt(initSize));
basicDataSource.setMaxActive(Integer.parseInt(maxSize));
return basicDataSource;
}
//通过连接池获取连接对象
public static Connection getConn(){
Connection connection = null;
try {
connection = DBUtil.getBData().getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
}
2.2.3 测试
Test包内的Java包下新建测试类:DBTest
import org.junit.Test;
import util.DBUtil;
import java.sql.Connection;
public class DBTest {
//单元测试 junit 单元测试包
/*单元测试方法
注意:1 方法返回值只能写void
2 方法不能传参数
3 方法上面使用@Test注解*/
@Test
public void test1(){
Connection conn = DBUtil.getConn();
System.out.println("conn:"+conn);
}
}
测试结果:
打印了 conn 数据库连接池连接成功