DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
首先,下载必须的jar包
dbcp包,目前版本是2.1.1 : http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
pool包,目前版本是2.4.2: http://commons.apache.org/proper/commons-pool/download_pool.cgi
Apache Commons Logging 包 目前版本为1.2: http://commons.apache.org/proper/commons-logging/download_logging.cgi
MySQL的jar包mysql-connector-java-5.1.39-bin目前是5.1.39版本: http://dev.mysql.com/downloads/connector/j/
演示代码:
package cn
.hncu.dbcp
import java
.sql.Connection
import java
.sql.SQLException
import java
.util.Properties
import javax
.sql.DataSource
import org
.apache.commons.dbcp2
.BasicDataSource
import org
.apache.commons.dbcp2
.BasicDataSourceFactory
import org
.junit.Test
public class DbcpPoolDemo {
// 纯Java方式设置参数,使用dbcp池
@Test
public void testDbcp() {
BasicDataSource pool = new BasicDataSource()
pool
.setUsername(
"root")
pool
.setPassword(
"1234")
pool
.setDriverClassName(
"com.mysql.jdbc.Driver")
pool
.setUrl(
"jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8")
System
.out.println(pool
.getMaxIdle())
System
.out.println(pool
.getMaxWaitMillis())
System
.out.println(pool
.getInitialSize())
System
.out.println(pool
.getMaxTotal())
System
.out.println(
"----------------")
// pool
.setMaxTotal(
20)
// 从它的池中获取连接
for (int i =
0
Connection con = null
try {
con = pool
.getConnection()
} catch (SQLException e) {
e
.printStackTrace()
}
System
.out.println(i +
":" + con
.hashCode())
}
}
// 通过配置文件方式设置参数,使用dbcp池
@Test
public void testPropertyFile() throws Exception {
Properties p = new Properties()
p
.load(DbcpPoolDemo
.class.getResourceAsStream(
"dbcp.properties"))
// p
.load(DbcpPoolDemo
.class.getClassLoader()
.getResourceAsStream(
"dbcp.properties"))
DataSource pool = BasicDataSourceFactory
.createDataSource(p)
// 从它的池中获取连接
for (int i =
0
Connection con = pool
.getConnection()
System
.out.println(con
.hashCode())
if (i %
2 ==
0) {
con
.close()
}
}
}
}
一开始,默认的可以new的Connection对象为8个! 而且就算你是刚把原来的connection对象.close()也不会拿到重复Connection对象,以前的版本是会拿到原来还回去的Connectin对象的。
Connection池-本地线程管理对象
package cn.hncu.dbcp;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class DbcpUtil {
private static DataSource pool;
private static ThreadLocal<Connection> t =
new ThreadLocal<Connection>();
static{
try {
Properties p =
new Properties();
p.load(DbcpUtil.class.getResourceAsStream(
"dbcp.properties"));
pool = BasicDataSourceFactory.createDataSource(p);
}
catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource
getDataSource(){
return pool;
}
public static Connection
getConnection()
throws SQLException{
Connection con = t.get();
if(con==
null){
con=pool.getConnection();
t.set(con);
}
return con;
}
}
相对于自己写Connection池,用第三方的扩展包显然方便多。
转载请附上原文博客链接: http://blog.csdn.net/qq_26525215
谙忆
认证博客专家
Java
公众号:程序编程之旅。曾经写过C、C++,使用过Cocos2dx开发过游戏、安卓端、IOS端、PC端页面均开发过。目前专注Java开发,SaaS内核、元数据的研究。偶尔玩玩爬虫
转载请注明原文地址: https://ju.6miu.com/read-1302836.html