-
什么是数据库连接池
数据库连接池是一个包含多个数据连接对象的容器 -
为什么需要
反复创建销毁connection效率低下,出现大量不发效率可以不足。
数据库连接池可以预先创建好多个Connection对象,避免反复创建。
- 创建数据库连接对象
首先加入坐标
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
public class Demo3 {
public static void main(String[] args) throws IOException, SQLException {
//创建数据连接池对象
BasicDataSource ds = new BasicDataSource();
InputStream is = DBUtils.class.getClassLoader()
.getResourceAsStream("jdbc.properties");
//实例化Properties类用于解析jdbc.properties
Properties p = new Properties();
//加载jdbc.properties文件中获得连接数据库需要的参数变量
p.load(is);
//从jdbc.properties文件中获得连接数据库需要的参数变量
String driver = p.getProperty("driver");
String url = p.getProperty("url");
String username = p.getProperty("username");
String password = p.getProperty("password");
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
//设置连接池对象对连接对象的管理策略
//设置连接池的初始连接数量
ds.setInitialSize(3);
//设置最大的连接数
ds.setMaxActive(5);
//设置最大空闲连接数
ds.setMaxIdle(3);
//最终目的:从数据连接池获得连接
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
数据连接池代码开始运行和到结束只需要加载一次,所有放入静态代码块中。
数据连接池版本DBUtils
public class DBUtils {
//支持数据库连接池和jdbc.properties的DBUtils类
//声明一个数据连接池对象
private static BasicDataSource ds;
//静态块中,初始化数据连接对象
static {
//获得这个文件的输入流
InputStream is = DBUtils_2.class.getClassLoader()
.getResourceAsStream("jdbc.properties");
//实例化Properties类用于解析jdbc.properties
Properties p = new Properties();
//加载jdbc.properties文件中获得连接数据库需要的参数变量
try {
p.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//从jdbc.properties文件中获得连接数据库需要的参数变量
String driver = p.getProperty("driver");
String url = p.getProperty("url");
String username = p.getProperty("username");
String password = p.getProperty("password");
//将获取的信息赋值给数据连接池作为参数
//赋值前先进行实例化对象,不然后报空指针错误
ds = new BasicDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
//不设置也有默认值
ds.setInitialSize(3);
ds.setMaxActive(5);
//最大空闲数
ds.setMaxIdle(3);
}
//获得连接结构没有变化
public static Connection getConn() throws SQLException {
//通过连接池获取连接对象
Connection conn = ds.getConnection();
// System.out.println(conn);
return conn;
}
}
调用连接池方式不变
public class Demo1 {
public static void main(String[] args) {
try(Connection conn = DBUtils.getConn();){
//创建执行命令对象
Statement st = conn.createStatement();
//定义sql语句
String sql="select ename from emp";
ResultSet rs = st.executeQuery(sql);
while (rs.next()){
String ename = rs.getString(1);
System.out.println(ename);
}
}catch (Exception e){
e.printStackTrace();
}
}
}