建立数据库连接是一个非常耗时耗资源的行为,通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
有两个需要的jar包:commons-dbcp.jar,commons-pool.jar
先创建配置文件(dbcp.properties),直接放到src下
driverClassName = com.microsoft.sqlserver.jdbc.SQLServerDriver
url = jdbc:sqlserver://127.0.0.1:1433;DatabaseName=XSGL
username = sa
password = ******
initialSize = 1
maxActive = 20
minIdle = 5
maxIdle = 8
maxWait = 60000
#initialSize :连接池启动时创建的初始化连接数量(默认值为0)
#maxActive :连接池中可同时连接的最大的连接数(默认值为8,高峰单机器在20并发左右,自己根据应用场景定)
#maxIdle:连接池中最大的空闲的连接数,超过的空闲连接数的连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为在高负载的情况下,连接的打开时间比关闭的时间快,引起连接池中idle的个数上升超过maxIdle,而造成频繁的连接销毁和创建)
#minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建高于minIdle个数的连接)
#maxWait :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,避免因线程池不够用,而导致请求被无限制挂起)
定义一个dbcp的工具类
package hhuc.dbcpsqlconnection;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
/*
* author:Cenhelm
* dbcp工具类获取数据源连接
*/
public class DbcpUtils {
private static DataSource ds = null;
private DbcpUtils() {}
static {
try {
//获得配置文件路径
InputStream is = DbcpUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");
//加载配置文件
Properties props = new Properties();
props.load(is);
//创建数据源对象
ds = BasicDataSourceFactory.createDataSource(props);
//关闭输入流
is.close();
}catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void close(ResultSet rs, Statement st, Connection conn) {
try {
rs.close();
st.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在创建数据库连接时稍有不同,调用数据源的getConnection()方法,因为静态语句块已经加载过配置文件
Connection conn = DbcpUtils.getConnection();