文档章节

java数据库连接池

iborder
 iborder
发布于 2016/12/06 22:12
字数 1005
阅读 15
收藏 3

        web项目都会使用数据库,而数据库访问会影响系统性能(I/O操作)。建立数据库连接是一个非常耗时耗资源的操作,通过配置连接池可以在系统启动时就分配并维护一定数量的连接,保持最低数量的连接数,通过设定连接池最大连接数来防止系统无尽的与数据库连接。这样在每次数据请求方需要连接时,直接从连接池获取,使用完毕之后再放回去,这样就可以尽可能减少不必要的数据库连接消耗,缓解数据库的访问压力,减轻对系统性能的影响。

        java常用的数据库连接池主要有 DBCP 和 C3P0;

一、DBCP

DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 Java 连接池项目,也是Tomcat 在 7.0 以前的版本使用的连接池组件。

使用DBCP应该导入commons-dbcp-x.x.jar、commons-pool-x.x.jar、commons-logging-x.x.jar

commons-dbcp最新版本是Apache Commons DBCP 2.1.1 for JDBC 4.1 (Java 7.0+)

Apache Commons Pool 2.4.2 (Java 6.0+)

Apache Commons Logging 1.2

测试实例

TestDBCP.java

package cn.iborder.utils;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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 TestDBCP {
	
	//硬编码方式实现连接池
	@Test
	public void test1() {
		Connection con = null;
		PreparedStatement pstat = null;
		ResultSet rs = null;
		
		BasicDataSource dataSource = new BasicDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost/test");
		dataSource.setUsername("root");
		dataSource.setPassword("root");
		dataSource.setInitialSize(3);
		//dataSource.setMaxActive(6); //DBCP2.0以上版本已经移除此方法,由 setMaxTotal()代替
		dataSource.setMaxTotal(6);	//最大连接数
		dataSource.setMaxIdle(5); 	//最大空闲连接数.
		dataSource.setMinIdle(4);
		
		try {
			con = dataSource.getConnection();
			pstat = con.prepareStatement("select * from admin");
			rs = pstat.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(rs != null){
					rs.close();
					rs=null;
				}
				if(pstat != null){
					pstat.close();
					pstat=null;
				}
				if (con != null && !con.isClosed()) {
					con.close();
					con=null;
				}
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}
	
	//配置文件方式实现连接池
	@Test
	public void test2() {
		Connection con = null;
		PreparedStatement pstat = null;
		ResultSet rs = null;
		try {
			Properties prop = new Properties();
			BufferedInputStream in = (BufferedInputStream) this.getClass().getResourceAsStream("/db.properties");
			//FileInputStream in = (FileInputStream) TestDBCP.class.getResourceAsStream("/db.properties");//抛异常
			prop.load(in);
			DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
			con = dataSource.getConnection();
			pstat = con.prepareStatement("select * from admin");
			rs = pstat.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(rs != null){
					rs.close();
					rs=null;
				}
				if(pstat != null){
					pstat.close();
					pstat=null;
				}
				if (con != null && !con.isClosed()) {
					con.close();
					con=null;
				}
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}

}

db.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/test
username=root
password=root
InitialSize=3
MaxTotal=6
MaxIdle=5
MinIdle=4

二、C3P0

C3P0是一个开放源代码的JDBC连接池,最常用的连接池技术,Spring/Hibernate框架默认支持C3P0

使用C3P0 应该导入c3p0.xxxx.jar和mchange-commons-java-x.x.x.jar

C3P0最新版本是C3P0 0.9.5.2
核心类:CombopooledDataSource
测试实例

TestC3P0.java

package cn.iborder.utils;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class TestC3P0 {

	//硬编码方式实现连接池
	@Test
	public void test1(){
		Connection con = null;
		PreparedStatement pstat = null;
		ResultSet rs = null;
		
		try {
			ComboPooledDataSource dataSource = new ComboPooledDataSource();
			dataSource.setDriverClass("com.mysql.jdbc.Driver");
			dataSource.setJdbcUrl("jdbc:mysql://localhost/test");
			dataSource.setUser("root");
			dataSource.setPassword("root");
			dataSource.setInitialPoolSize(3);
			dataSource.setMaxPoolSize(6);
			dataSource.setMaxIdleTime(1000);
			
			con = dataSource.getConnection();
			pstat = con.prepareStatement("select * from admin");
			rs = pstat.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
			}
		} catch (PropertyVetoException e) {
			// TODO: handle exception
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  finally {
			try {
				if(rs != null){
					rs.close();
					rs=null;
				}
				if(pstat != null){
					pstat.close();
					pstat=null;
				}
				if (con != null && !con.isClosed()) {
					con.close();
					con=null;
				}
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}
	
	//配置文件方式实现连接池
	@Test
	public void test2() {
		Connection con = null;
		PreparedStatement pstat = null;
		ResultSet rs = null;
		try {
			//读取默认数据库
			//ComboPooledDataSource dataSource = new ComboPooledDataSource();
			
			//读取指定name的数据库
			ComboPooledDataSource dataSource = new ComboPooledDataSource("otherDB");
			
			con = dataSource.getConnection();
			pstat = con.prepareStatement("select * from admin");
			rs = pstat.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  finally {
			try {
				if(rs != null){
					rs.close();
					rs=null;
				}
				if(pstat != null){
					pstat.close();
					pstat=null;
				}
				if (con != null && !con.isClosed()) {
					con.close();
					con=null;
				}
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}
}

c3p0-config.xml

<c3p0-config>
	<!-- 默认数据库 -->
	<default-config>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="initialPoolSize">3</property>
		<property name="maxPoolSize">6</property>
		<property name="maxIdleTime">1000</property>

		<user-overrides user="swaldman">
			<!-- 
			<property name="unreturnedConnectionTimeout">5</property>
			<property name="debugUnreturnedConnectionStackTraces">true</property> 
			-->
			<!-- <property name="preferredTestQuery">select poop from doop</property> -->
			<!-- intentionally broken -->
		</user-overrides>

	</default-config>

	<!-- 配置其他是数据库 -->
	<named-config name="otherDB">
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="initialPoolSize">3</property>
		<property name="maxPoolSize">6</property>
		<property name="maxIdleTime">1000</property>
	</named-config>

</c3p0-config>

 

© 著作权归作者所有

共有 人打赏支持
iborder
粉丝 4
博文 73
码字总数 48998
作品 0
揭阳
程序员
Hinernate中获得数据库连接池的方式及应用

Hibernate可以与任何一种java应用的运行环境集成。Java应用的运行环境可分为两种。 (1)受管理环境(Managed environment):由容器负责管理各种共享资源(如线程池和数据库连接池),以及管理...

_守望者_
2014/04/22
0
0
Java的JDBC数据库连接池实现方法

虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库连接池,不过对于开发一般的Java Application、 Applet或者JSP、velocity时,我们可用的JDBC数据库连接池并不多,并且一般性能都不好...

lixun
2012/10/11
0
0
主流Java数据库连接池比较及前瞻

本文转载自微信公众号「工匠小猪猪的技术世界」 主流数据库连接池 常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JND...

渣渣(Charles)
04/30
0
0
数据库连接池种类,你会那种??

在Java中开源的数据库连接池有以下几种 : 1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate[1]一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement...

一一叶
2014/03/11
0
1
析评数据库连接池(创世纪新篇)

学习Java语言,对于数据库连接池不陌生啦。例如,一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不...

crossmix
2015/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Minifilter的动态安装、加载及卸载

MINIFILTER框架的文件系统过滤驱动,无法使用的CreateService和OpenService进行动态加载。 看了一下,使用Inf文件安装Minifilter驱动的方式是在注册表驱动服务项下比传统驱动多创建了Instanc...

simpower
26分钟前
3
0
idea新建springCloud项目(6)- Config Server使用

1.在IDEA新建springCloud项目-Config Server 修改版本,和之前建的eureka项目版本一致,修改完记得刷新: 删除掉不需要的文件: 2.把Config S 服务注册到eureka上去,配置git地址,启动项目 ...

monroeCode
32分钟前
4
0
大数据可视化项目开发总纲

第1章 开发文档总纲 1.1 开发工具清单 名称 版本 备注 Pentaho-bi server pentaho-server-ce-7.1 Pentaho Cde为其内置工具 Pentaho-prd pentaho-prd-ce-7.1 Pentaho Report Designer报表工具...

ZhangLG
32分钟前
4
0
pip安装超时问题

pip3 install --default-timeout=100 tensorflow 设置为100秒 参考: User Guide How to solve ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org', port=443) with pip?......

亚林瓜子
34分钟前
2
0
fragment 旋转时保持当前实例

设备旋转时保存Fragment的交互状态: setRetainInstance(true);

zdglf
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部