JDBC基础之DBCP数据源讲解
在JDBC的基础上,我们发现来回的获得数据库连接返回数据库连接给书库会大大降低数据库的执行效率。所以我们可以采用使用连接池的方式来放置连接、获取连接。当我们需要数据库连接的时候,我们不在向数据库获取,而是从连接池中获得数据库的连接,用完连接之后也不再返回给数据库,而是直接返回给连接池。这样数据库的效率的到很大的提升。
常用的数据库连接池有两种:dbcp和c3p0。
①dbcp连接池
首先,我们需要将数据库需要的jar包导入,一个是commons-dbcp.jar、一个是commons-pool.jar.然后在工程下的src目录下导入需要使用的properties文件,该文件中保存了连接数据库需要的一些信息,该文件内容如下:
写好该文件后,编程些测试程序,JDBCUtil_dbcp.java
public class JDBCUtil_dbcp {
private static DataSource ds=null;
static{
try {
InputStream in = JDBCUtil_dbcp.class.getClassLoader().getResourceAsStream("db.properties");
Properties pt = new Properties();
pt.load(in);
//创建工厂
BasicDataSourceFactory db = new BasicDataSourceFactory();
ds = db.createDataSource(pt);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
return ds.getConnection();
}
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stat != null){
try {
stat.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
编写测试类,TransactionDemo3:
public class TransactionDemo3 {
@Test
public void TransactionDemo() throws SQLException{
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
try{
conn =JDBCUtil_dbcp.getConnection();
System.out.println("Connection:"+conn.getClass().getName());
}finally{
JDBCUtil_dbcp.close(rs, stat, conn);
}
}
}
运行结果:Connection:org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
②c3p0连接池
JDUCUtil_c3p0工具类:
package com.nyist.cn.Utils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtil_c3p0 {
private static ComboPooledDataSource ds=null;
//设置一个静态代码块
static{
try {
ds = new ComboPooledDataSource(); //new 一个c3p0连接池
ds.setDriverClass("com.mysql.jdbc.Driver"); //设置需要的驱动
ds.setJdbcUrl("jdbc:mysql://localhost:3306/lhg"); //设置路径Url
ds.setUser("root"); //设置用户名
ds.setPassword("410923"); //设置密码
ds.setMaxPoolSize(30); //设置最大连接数
ds.setMinPoolSize(5); //设置最小连接数
ds.setInitialPoolSize(10); //设置初始化连接属
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
public static void close(ResultSet rs,Statement stat,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stat != null){
try {
stat.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
c3p0测试类:
package com.nyist.cn.Demo;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.Test;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;
import com.nyist.cn.Utils.JDBCUtil_c3p0;
public class TransactionDemo4 {
@Test
public void TransactionDemo() throws SQLException{
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
try{
conn =JDBCUtil_c3p0.getConnection();
System.out.println("Connection_c3p0:"+conn.getClass().getName());
}finally{
JDBCUtil_c3p0.close(rs, stat, conn);
}
}
}
运行结果如下:
以上是比较常用的两种连接池,使用JDBC代码如何使用。希望能够帮助到大家。