工作中,遇到了应用程序需要数据库连接池.这无疑是对程序性能的一个挑战.为什么使用数据库连接池呢?因为每次新建个连接,非常耗费资源.本人在自己的笔记本上做实验的结果如下:
每秒中,可以向MySQL中插入纪录4000条.而创建一个连接则需要200毫秒左右的时间.使用了连接池技术以后,创建连接几乎不用任何时间,用System.currentTimeMillis()打印时间差,为0毫秒.可见在大量并发访问的情况下,系统的性能通过连接池得到了飞跃.
因此搜索了好多开源框架,找到了DBCP.Tomcat的数据源技术,也是基于DBCP实现的.DBCP数据库连接池使用的方式很多,动态设置,配制文件(xml,properties).下面是示例代码.以及相关的驱动包我也给出来了.有兴趣的朋友们可以去试验一下.^-^
数据库连接字符串例子
String url="jdbc:sqlserver://localhost:1433;database=数据库名;user=用户名;password=密码";
其中,connection有多个构造方法,可以根据自己的需要调整连接字符串是否有用户名和密码.
commons项目地址:http://commons.apache.org/
注意:
timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis,他们两个配合,可以持续更新连接池中的连接对象,当 timeBetweenEvictionRunsMillis 大于0时,每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。
参考
commons-dbcp源码研究
http://macrochen.iteye.com/blog/320077
每秒中,可以向MySQL中插入纪录4000条.而创建一个连接则需要200毫秒左右的时间.使用了连接池技术以后,创建连接几乎不用任何时间,用System.currentTimeMillis()打印时间差,为0毫秒.可见在大量并发访问的情况下,系统的性能通过连接池得到了飞跃.
因此搜索了好多开源框架,找到了DBCP.Tomcat的数据源技术,也是基于DBCP实现的.DBCP数据库连接池使用的方式很多,动态设置,配制文件(xml,properties).下面是示例代码.以及相关的驱动包我也给出来了.有兴趣的朋友们可以去试验一下.^-^
数据库连接字符串例子
String url="jdbc:sqlserver://localhost:1433;database=数据库名;user=用户名;password=密码";
其中,connection有多个构造方法,可以根据自己的需要调整连接字符串是否有用户名和密码.
commons项目地址:http://commons.apache.org/
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class TestDBCP {
public static void main(String[] args) throws SQLException {
BasicDataSource ds = new BasicDataSource();
// 基本参数
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUsername("root");
ds.setPassword("147258369");
ds.setUrl("jdbc:mysql://192.168.0.34:3306/cold");
// 池属性
ds.setInitialSize(5);// 初始化连接池时,创建连接个数
ds.setMinIdle(10);// 最小空闲连接数
ds.setMaxIdle(100);// 最大空闲连接数
ds.setMaxActive(100);// 连接池最大并发容量
// 可选测试参数,数据连接检测使用,网上常说的BUG,就是因为没设置下面属性引起的CONNECTION失效.
ds.setValidationQuery("select 1");
ds.setTestOnBorrow(true);
ds.setTestOnReturn(true);
ds.setTestWhileIdle(true);
// 大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证
ds.setMinEvictableIdleTimeMillis(1 * 60 * 1000);
// 失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程
ds.setTimeBetweenEvictionRunsMillis(5 * 60 * 1000);
DataSource ds2 = (DataSource) ds;
System.out.println(ds2.getConnection());
}
}
注意:
timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis,他们两个配合,可以持续更新连接池中的连接对象,当 timeBetweenEvictionRunsMillis 大于0时,每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。
参考
commons-dbcp源码研究
http://macrochen.iteye.com/blog/320077