DBCP数据库连接池
- DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
Commons-dbcp.jar:连接池的实现 Commons-pool.jar:连接池实现的依赖库 Tomcat
的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
- 核心代码
static{
InputStream in = JdbcUtil.class.getClassLoader().
getResourceAsStream("dbcpconfig.properties");
Properties prop = new Properties();
prop.load(in);
BasicDataSourceFactory factory = new BasicDataSourceFactory();
dataSource = factory.createDataSource(prop);
}
- 我的代码示例
package dpcpPoolUse;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;
public class DbcpPoolDemo {
@Test
public void testDbcp() throws SQLException, InterruptedException{
// DataSource pool=new BasicDataSource();//不能用DataSource,因为里面没有set。。函数
BasicDataSource pool=new BasicDataSource();//创建一个池对象
pool.setDriverClassName("com.mysql.jdbc.Driver");
pool.setUrl("jdbc:mysql://127.0.0.1:3306/sstud?useUnicode=true&characterEncoding=utf-8");
pool.setUsername("root");
pool.setPassword("1234");
System.out.println(pool.getDefaultCatalog());//获取默认参数
System.out.println(pool.getInitialSize());//获取连接池初始化大小
// System.out.println(pool.getLoginTimeout());//登录限制时间
System.out.println(pool.getMaxWait());//pool最长等待时间(-1)
System.out.println(pool.getMaxIdle());////最大空闲时间。如果一个用户获取一个连接,不用,多长时间会被强行收回
System.out.println(pool.getMaxActive());//pool最多获得数
System.out.println("__________________");
//自己设置参数
// pool.setMaxWait(1);
// pool.setMaxIdle(1);
pool.setMaxActive(20);
for(int i=0;i<20;i++){
// Thread.sleep(1100);
Connection con=pool.getConnection();//优先拿到刚刚使用过得
System.out.println(i+":::::::::::"+con.hashCode());
// con.close();
}
}
//通过配置文件 读取
@Test
public void testPropertyFile() throws Exception{
Properties p=new Properties();
// p.load(ClassLoader.getSystemClassLoader().getSystemResourceAsStream("dpcp.properities"));//配置文件要放在src(bin)的根目录---classpath的根
p.load(DbcpPoolDemo.class.getResourceAsStream("dbcp.properities"));//配置文件和当前类的class放在一起
DataSource pool=BasicDataSourceFactory.createDataSource(p);//DataSource要通过配置文件读取
//DataSource 不能进行常规设置
//从它的池中获取连接(8个)
for(int i=0;i<10;i++){
Connection con=pool.getConnection();
System.out.println(i+":::::"+con.hashCode());
if((i&1)==0){
con.close();
}
}
}
}
- 连接池DbcpUtil工具
package dpcpPoolUse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DbcpUtil {
private static DataSource pool=null;
// static BasicDataSource pool=new BasicDataSource();//创建一个池对象
private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();
static{
Properties p=new Properties();
try {
// pool.setDriverClassName("com.mysql.jdbc.Driver");
// pool.setUrl("jdbc:mysql://127.0.0.1:3306/sstud?useUnicode=true&characterEncoding=utf-8");
// pool.setUsername("root");
// pool.setPassword("1234");
Class.forName("com.mysql.jdbc.Driver");//需要自己写
p.load(DbcpPoolDemo.class.getResourceAsStream("dbcp.properities"));//配置文件和当前类的class放在一起
System.out.println(p);
pool=BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
//返回DataSource--池
public static DataSource getDataSource(){
return pool;
}
public static ThreadLocal<Connection> getTl() {
return tl;
}
public static void setTl(Object object) {
DbcpUtil.tl = (ThreadLocal<Connection>) object;
}
public static Connection getCon(){
Connection con=tl.get();
if(con==null){
try {
con=pool.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
tl.set(con);
}
return con;
}
public static void main(String[] args) {
System.out.println(getCon());
}
}
C3P0数据库连接池
- C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
- 和DPCP的区别:
1).dbcp没有自动回收空闲连接的功能
2).c3p0有自动回收空闲连接功能
时间: 2024-11-02 14:30:44