1.连接池的概念
为什么要有连接池?
由于建立数据库连接是一种非常耗时、耗资源的行为,
所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,使用完毕后再归还到连接池中。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等
2.DBCP连接池的使用
DBCP(DataBase Connection Pool)数据库连接池,
是Java数据库连接池的一种,由Apache开发,通过数据库连接池,
可以让程序自动管理数据库连接的释放和断开
使用步骤:
1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬编码
package com.xawl.demo;
import org.apache.commons.dbcp.BasicDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws SQLException {
//DBCP
//1.引入jar 包,记得依赖下。
//第一种使用方式,:硬编码,参数写死在代码里面。
//创建连接池对象。
BasicDataSource ds = new BasicDataSource();
//设置基本参数
ds.setUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("root");
ds.setPassword("123456");
ds.setDriverClassName("com.mysql.jdbc.Driver");
//其他参数
ds.setInitialSize(5);
ds.setMaxWait(5000);
//从连接池中取一个连接对象
Connection conn = ds.getConnection();
System.out.println(conn);
//conn.prepareStatement()
String sql="insert into category values(?,?);";
PreparedStatement st=conn.prepareStatement(sql);
//设置参数
st.setString(1, "c011");
st.setString(2, "饮料");
int i = st.executeUpdate();
System.out.println(i);
}
}
采用配置文件的方式
package com.xawl.demo;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;
public class MyTest2 {
public static void main(String[] args) throws Exception {
//DBCP 配置文件的方式
Properties properties = new Properties();
properties.load(new FileInputStream("dbcp.properties"));
DataSource ds = new BasicDataSourceFactory().createDataSource(properties);
Connection connection = ds.getConnection();
System.out.println(connection);
//connection.prepareStatement()
String sql="insert into category values(?,?);";
PreparedStatement st=conn.prepareStatement(sql);
//设置参数
st.setString(1, "c012");
st.setString(2, "饮料1");
int i = st.executeUpdate();
System.out.println(i);
}
}
3.C3P0连接池的使用
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
c3p0与dbcp区别
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
使用步骤:
1.导入jar包(c3p0-0.9.1.2.jar)
2.使用api
方式1:硬编码
package com.xawl.demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MyTest {
public static void main(String[] args) throws PropertyVetoException, SQLException {
//1.引入 c3p0 连接池jar包 (当然数据库驱动jar包不要忘了)
//1. 硬编码的方式。
ComboPooledDataSource ds = new ComboPooledDataSource();
//四个最基本的参数
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUser("root");
ds.setPassword("123456");
ds.setDriverClass("com.mysql.jdbc.Driver");
//其他参数
ds.setInitialPoolSize(10);
ds.setMinPoolSize(3);
//获取连接对象
Connection connection = ds.getConnection();
System.out.println(connection);
PreparedStatement preparedStatement = connection.prepareStatement("select * from bank");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String name = resultSet.getString(2);
System.out.println(name);
}
resultSet.close();
ds.close();
}
}
采用配置文件的方式
要求1:配置文件的名称:c3p0.properties 或者 c3p0-config.xml
要求2:配置文件的路径:src下
package com.xawl.demo;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class MyTest2 {
public static void main(String[] args) throws SQLException {
//c3p0:配置文件方式的要求。1.配置文件的名字是固定的。2.配置文件放的位置src下
ComboPooledDataSource ds = new ComboPooledDataSource("second-config");
Connection connection = ds.getConnection();
System.out.println(connection);
ds.close();
}
}
4.Druid 阿里德鲁伊连接池的使用
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。
使用步骤,导入德鲁伊的jar包
1.采用硬编码的方式
//采用硬编码的方式来创建连接池
DruidDataSource dataSource = new DruidDataSource();
//设置参数
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/crm");
dataSource.setInitialSize(5);
dataSource.setMinIdle(1);
dataSource.setMaxActive(10);
//获取连接对象
DruidPooledConnection connection = dataSource.getConnection();
System.out.println(connection);
2.采用配置文件的方式,
a.引入配置文件
b.加载配置文件
//采用加载配置文件的方式
Properties properties = new Properties();
properties.load(new FileInputStream("src/db_server.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection conn = dataSource.getConnection();
System.out.println(conn);
5.DBUtils的使用
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,
使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
使用步骤:
1.导入jar包(commons-dbutils-1.4.jar)
2.创建一个queryrunner类
queryrunner作用:操作sql语句
构造方法:
new QueryRunner(Datasource ds);
3.编写sql
4.执行sql
query(..):执行查询操作
update(...):执行增删改操作
使用步骤
// 创建对象
QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
// 定义sql
String sql = "insert into bank(username,money) values(?,?)";
// 执行sql
runner.update(sql,"赵六",500);
....
执行查询后返回的结果集
ResultSetHandler:封装结果集 接口
BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
演示
package com.xawl.demo2;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.util.Properties;
public class MyTest {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream("druid.properties"));
DataSource ds = new DruidDataSourceFactory().createDataSource(properties);
//传入数据源
QueryRunner queryRunner = new QueryRunner(ds);
int i = queryRunner.update("insert into bank values (?,?,?)", null, "赵六", 2000);
System.out.println(i);
//queryRunner.query()
}
}
package com.xawl.demo2;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.xawl.bean.Bank;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.util.List;
import java.util.Properties;
public class MyTest2 {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream("druid.properties"));
DataSource ds = new DruidDataSourceFactory().createDataSource(properties);
//传入数据源
QueryRunner queryRunner = new QueryRunner(ds);
//查询一条
Bank bank = queryRunner.query("select * from bank where id=?", new BeanHandler<Bank>(Bank.class), 1);
System.out.println(bank);
System.out.println("==========================================================");
//查询多条
List<Bank> list = queryRunner.query("select * from bank where id>?", new BeanListHandler<Bank>(Bank.class), 0);
for (Bank bank1 : list) {
System.out.println(bank1);
}
}
}
bean类
package com.xawl.bean;
public class Bank {
/**
* 主键id
*/
private Integer id;
/**
* 用户名
*/
private String username;
/**
* 账户余额
*/
private Integer money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
@Override
public String toString() {
return "Bank{" +
"id=" + id +
", username='" + username + '\'' +
", money=" + money +
'}';
}
}