目录
连接池介绍
常用连接池
DBCP连接池
硬编码方式
配置文件方式
C3P0连接池
C3P0和DBCP的区别
硬编码方式
配置文件方式
Druid连接池
硬编码方式
配置文件方式
DBUtils
连接池介绍
由于建立数据库连接是一种非常耗时、耗资源的行为,所以预先通过连接池创建一些连接,放在内存中,当程序需要建立数据库连接时,直接在连接池中申请一个,使用完毕再还回去。连接池就跟线程池一样,使用时申请,使用结束归还。数据库连接由连接池分配、管理、和释放,一个程序能重复使用一个连接池中的连接,而不用重复创建,还可以设置连接池的初始连接数,最大最小连接数等。
常用连接池
DBCP连接池
DBCP(DataBase Connextion Pool)——数据库连接池
由Apache开发,数据库连接池自动管理数据库连接的分配和释放。
硬编码方式
使用步骤:
1.导入DBCP的jar包
2.硬编码,自己创建连接池对象
BasicDataSource ds = new BasicDataSoue();
3.配置连接参数
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/lianxi");
ds.setUsername("root");
ds.setPassword("123456");
ds.setInitialSize(20);
ds.setMaxWait(2000);
配置参数有很多,这里只写几个。
4.从连接池中获取连接对象
Connection conn = ds.getConnection();
String sql="select * from user";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt(1);
String uname = resultSet.getString(2);
String pwd = resultSet.getString(3);
System.out.println(id+"==="+uname+"==="+pwd);
}
完整代码:
package org.xingyun.demo2;
import org.apache.commons.dbcp.BasicDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBCPdemo {
public static void main(String[] args) throws SQLException {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/lianxi");
ds.setUsername("root");
ds.setPassword("123456");
ds.setInitialSize(20);
ds.setMaxWait(2000);
Connection conn = ds.getConnection();
String sql="select * from user";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt(1);
String uname = resultSet.getString(2);
String pwd = resultSet.getString(3);
System.out.println(id+"==="+uname+"==="+pwd);
}
conn.close();
preparedStatement.close();
resultSet.close();
}
}
配置文件方式
建立配置文件dbcp.properties
#连接基本设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/lianxi username=root password=123456 #<!--扩展配置 了解--> #初始化连接 initialSize=10 #最大连接数量 maxActive=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=gbk #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED
package org.xingyun.demo2;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DBCPdemo2 {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
//读取配置文件
properties.load(new FileInputStream("src/dbcp.properties"));
//创建连接池对象
DataSource ds = BasicDataSourceFactory.createDataSource(properties);
//获取连接对象
Connection conn = ds.getConnection();
String sql="select * from user";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt(1);
String uname = resultSet.getString(2);
String pwd = resultSet.getString(3);
System.out.println(id+"==="+uname+"==="+pwd);
}
}
}
C3P0连接池
它是一个开源的连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。
C3P0和DBCP的区别
1.DBCP不能自动回收空闲的连接
2.C3P0可以自动回收空闲的连接
硬编码方式
1.导入C3P0的jar包
2.创建连接池对象
ComboPooledDataSource ds = new ComboPooledDataSource();
3.配置连接参数
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/lianxi");
ds.setUser("root");
ds.setPassword("123456");
4.获取连接对象以及之后的操作和之前一样
完整代码
package org.xingyun.demo2;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0demo {
public static void main(String[] args) throws PropertyVetoException, SQLException {
//创建连接池对象
ComboPooledDataSource ds = new ComboPooledDataSource();
//配置连接参数
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/lianxi");
ds.setUser("root");
ds.setPassword("123456");
//获取连接对象
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
配置文件方式
C3P0配置文件的方式,对配置文件有要求。
1.配置文件名是固定的——c3p0.properties
2.配置文件的位置也是固定的,放在src下
package org.xingyun.demo2;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0demo2 {
public static void main(String[] args) throws SQLException {
ComboPooledDataSource ds = new ComboPooledDataSource();
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
在使用C3P0连接池时,配置文件不用我们自己读取,它会读取,并配置好连接参数。我们只需要直接用就可以了。
Druid连接池
Druid(德鲁伊)连接池是阿里巴巴开源的一个数据库连接池,结合了DBCP、C3P0等连接池的优点,同时加入了日志监控,可以很好地监控数据库连接和sql的执行情况,得优于监控,为监控而生。
硬编码方式
1.导入德鲁伊得jar包
2.创建连接池
DruidDataSource dataSource = new DruidDataSource();
3.配置路径参数和获取连接对象和DBCP连接池一样
package org.xingyun.demo2;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import java.sql.SQLException;
public class Druiddemo {
public static void main(String[] args) throws SQLException {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/lianxi");
ds.setUsername("root");
ds.setPassword("123456");
DruidPooledConnection conn = ds.getConnection();
System.out.println(conn);
}
}
配置文件方式
druid.properties
#基本配置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost/crm username=root password=123456 #可选配置 filters=stat initialSize=2 maxActive=300 maxWait=60000 timeBetweenEvictionRunsMillis=60000 minEvictableIdleTimeMillis=300000 validationQuery=SELECT 1 testWhileIdle=true testOnBorrow=false testOnReturn=false poolPreparedStatements=false maxPoolPreparedStatementPerConnectionSize=200
package org.xingyun.demo2;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;
public class Druiddemo2 {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream("src/druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
DBUtils
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,
使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
使用步骤:
1.导入jar包
2. 创建对象
Properties properties = new Properties();
properties.load(new FileInputStream("src/druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
//把连接池对象传给QueryRunner
QueryRunner queryRunner = new QueryRunner(ds);
3.执行sql
查询:
List<Bank> list = queryRunner.query("select * from bank", new BeanListHandler<Bank>(Bank.class));
for (Bank bank : list) {
System.out.println(bank);
}
插入:
package org.xingyun.demo2;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.xingyun.bean.Bank;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;
public class DButilsdemo2 {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream("src/druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
//把连接池对象传给QueryRunner
QueryRunner queryRunner = new QueryRunner(ds);
int i = queryRunner.update("insert into bank(username,money) values(?,?)","wangqi", 2000);
System.out.println(i);
}
}
更新:
package org.xingyun.demo2;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.xingyun.bean.Bank;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;
public class DButilsdemo2 {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream("src/druid.properties"));
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
//把连接池对象传给QueryRunner
QueryRunner queryRunner = new QueryRunner(ds);
int i = queryRunner.update("update bank set username=?,money=? where id=?", "zhangjie", 20000, 3);
System.out.println(i);
}
}