在JDBC编程中,每次创建连接对象和断开连接对象都会消耗一定的IO资源,建立数据库的连接过程中, 没次都要进行验证用户和密码,并且位数据库的连接分配内存资源,此过程需要把代表连接的java.sql.Connection对象,加载到内存中,当建立连接的数量非常的的时候,就需要频繁的创建,断开数据库的连接,大大降低了数据库访问的效率,起始应用程序需要建立数据库连接时直接到连接池中申请一个就行,使用完毕后再归还到连接池中。
DBCP是数据库连接池的简称(DataBase Connection Pool),是Apache组织下的开源连接池的实现,也是Tomcat服务器使用连接池的组件,通过它我们就不用自己去写数据库连接池了 ,单独使用DBCP数据源时需要导入三个Jar包,没有 的话直接去官网下载就行啦~
还有别忘了导入数据库连接的Jar,否则注册不了驱动~
方法名称 | 功能 |
---|---|
void setDriverClassName(String driverClassName) | 设置数据库驱动名称 |
void setUrl(String url) | 设置数据库的连接路径 |
void setUserName(String username) | 设置数据库的账号 |
void setPassword(String password) | 设置数据库的密码 |
void setinitialSize(int initialSize) | 设置数据库初始化连接数量 |
void setMinldle(int mindle) | 设置数据库的最大活跃数量 |
void setMaxActive(int maxdle) | 设置数据库的最小活跃数量 |
Connection getConnection() | 从数据库连接池中获得连接 |
首先我们通过使用手动配置数据库连接的方式连接到数据库:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import utils.JDBCutils;
import org.apache.commons.dbcp2.BasicDataSource;
public class PracDBCP01 {
public static void main(String [] args) {
Connection conn= null;
Statement st = null;
ResultSet rs = null;
try {
BasicDataSource datasource = new BasicDataSource();
datasource.setDriverClassName("com.mysql.cj.jdbc.Driver");
datasource.setUrl("jdbc:mysql://localhost/bank?serverTimezone=GMT%2B8");
datasource.setUsername("root");
datasource.setPassword("81604152");
conn=datasource.getConnection();
String sql = "select * from balance";
st = conn.createStatement();
rs = st.executeQuery(sql);
while(rs.next()) {
String name =rs.getString("name");
int balance = rs.getInt("balance");
System.out.println(name+" "+balance);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCutils.ReleaseAll(conn, rs, st);
}
}
}
还是按照之前的方法,我们添加配置文件
#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost/bank?serverTimezone=GMT%2B8
username=root
password=81604152
#
initialSize=10
#最大连接数量
maxActive=50
#
maxIdle=20
#
minIdle=5
#
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
代码实现连接
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Properties;
import javax.sql.DataSource;
import utils.JDBCutils;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class DBCP02 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
// 1. 获取数据源实现对象(DataSource的对象工厂类)
BasicDataSourceFactory factroy = new BasicDataSourceFactory();
// 3.添加配置对象
Properties properties = new Properties();
// 4.获取文件对象
InputStream is = new FileInputStream("src//dbcpconfig.properties");
// 5.加载文件
properties.load(is);
// 2. 创建数据源对象,创建数据源需要添加配置文件对象
DataSource dataSource =factroy.createDataSource(properties);
// 6. 建立连接
conn = dataSource.getConnection();
// 7. 执行基本语句
String sql = "insert into balance values(?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "Steven");
ps.setInt(2, 600);
int x= ps.executeUpdate();
if(x > 0) {
System.out.println("ok");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCutils.Release(conn, ps);
}
}
}
C3P0是目前比较流行的一种数据库连接池,使用之前了解一下DataSource接口的实现类ComboPooledDataSource,它就是C3P0的核心类, 看看有那些常用的方法吧
其实和DBCP的 方法类似:
方法名称 | 功能 |
---|---|
void setDriverClass() | 设置数据库驱动名称 |
void setJdbcUrl() | 设置数据库连接路径 |
void setUser() | 设置数据库用户 |
void setPassword() | 设置数据库密码 |
void setMaxPoolSize() | 设置数据库最大连接数量 |
void setMinPoolSize() | 设置数据库最小连接数量 |
void setInitialPoolSize() | 设置数据库初始化连接数量 |
Connection getconnection() | 从连接池中获取连接 |
使用C3P0的连接方式同样需要导入Jar包:c3p0-0.9.5.4.jar找到 /c3p0-bin/c3p0-0.9.5.4/c3p0-0.9.5.4.bin.tgz下载就行啦~~
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import utils.JDBCutils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class c3p0 {
public static void main(String[] args) {
Connection conn= null;
Statement st =null;
ResultSet rs = null;
try {
// 创建datasource连接
ComboPooledDataSource datasource = new ComboPooledDataSource();
datasource.setDriverClass("com.mysql.cj.jdbc.Driver");
datasource.setJdbcUrl("jdbc:mysql://localhost/bank?serverTimezone=GMT%2B8");
datasource.setUser("root");
datasource.setPassword("81604152");
//获取连接
conn=datasource.getConnection();
String sql = "select * from balance";
st = conn.createStatement();
rs =st.executeQuery(sql);
while(rs.next()) {
String name =rs.getString("name");
int balance = rs.getInt("balance");
System.out.println(name+" "+balance);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCutils.ReleaseAll(conn, rs, st);
}
}
}
C3P0的配置文件时XML格式的:
com.mysql.cj.jdbc.driver
jdbc:mysql://localhost/bank?serverTimezone=GMT%2B8
root
81604152
10
30
100
10
200
注意:配置的文件名必须为c3p0-config.xml,文件路径必须是src根目录,否则读取不到配置文件信息,ComboPooledDataSource对象时会自动读取src下的XML文件
import java.sql.Connection;
import java.sql.PreparedStatement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import utils.JDBCutils;
public class C3p01 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
ComboPooledDataSource datasource = new ComboPooledDataSource();
conn = datasource.getConnection();
String sql = "insert into balance values(?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "Steven");
ps.setInt(2, 600);
int x= ps.executeUpdate();
if(x > 0) {
System.out.println("ok");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCutils.Release(conn, ps);
}
}
}
现在我们已经知道了怎么使用数据库连接池的方式进行和数据库的连接,以使用C3P0的方式为例,我们通过配置文件的 方式就可以实现连接,那么我们之气写的那个JDBCutils的工具类里面的加载数据库连接信息,获得连接的方式不就是没有用了吗? 当让就没用啦 ~ 看看如何修改吧~
修改方式:
package utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCutils2 {
static ComboPooledDataSource dataSource =null;
static {
//建立数据源对象
dataSource = new ComboPooledDataSource();
}
public static Connection getconn() throws SQLException {
// 获得连接
return dataSource.getConnection();
}
public static void ReleaseAll(Connection conn, ResultSet rs, Statement st) {
CloseConn(conn);
CloseRs(rs);
CloseSt(st);
}
public static void Release(Connection conn, Statement st) {
CloseConn(conn);
CloseSt(st);
}
private static void CloseConn(Connection conn) {
try {
if(conn != null) {
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally {
conn = null;
}
}
private static void CloseRs(ResultSet rs) {
try {
if(rs != null) {
rs.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally {
rs = null;
}
}
private static void CloseSt(Statement st) {
try {
if(st != null) {
st.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally {
st = null;
}
}
}
修改之后直接调用连接就行啦~
package C3P0;
import java.sql.Connection;
import java.sql.PreparedStatement;
import utils.JDBCutils2;
public class C3p01 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCutils2.getconn();
String sql = "insert into balance values(?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "Steven");
ps.setInt(2, 600);
int x= ps.executeUpdate();
if(x > 0) {
System.out.println("ok");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCutils2.Release(conn, ps);
}
}
}
无论是DBCP还是C3P0库连接池,他们就是给我们提供了一种更加便利高效,获取释放连接的方式,但是如果想要简化对数据库的操作 ,只关注于SQL语句的本身我们需要使用BDutils工具。