文档章节

java数据库连接池

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

        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数据库连接池比较及前瞻

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

渣渣(Charles)
2018/04/30
0
0
析评数据库连接池(创世纪新篇)

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

crossmix
2015/08/21
0
0
hibernate、c3p0、jdbc理解

大家好,请教大家概念问题,hibernate、c3p0、jdbc这三者是什么关系, 我的理解是:hibernate 是对jdbc的封装,可以面向对象(实体类)实现数据操作,jdbc就是java api提供的连接操作数据库的...

樱木花道VS康
2017/06/30
149
2
连接池详解,c3p0与dbcp的区别!

连接池: 连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。这项技术能明显提高对数据库操作的性能。 连接池的好处: (1)对于大多数应用程序,当它们正...

IT_laobai
2018/06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS5.11配置Let's Encrypt免费证书

安装环境: [root@WQ02 opt]# lsb_release -aLSB Version::core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd6......

m_lm
38分钟前
1
0
看看Canonical分享的2018年的十大Linux Snap

导读 Linux在2018年最令人耳目一新的一个方面是Snaps的普及。 Canonical透露,集装箱化的包装已经取得了巨大的成功。今天,Ubuntu制造商分享了2018年的十大Snap。 随着2018年即将结束,我发现...

问题终结者
51分钟前
3
0
天啦噜!在家和爱豆玩"剪刀石头布",阿里工程师如何办到?

阿里妹导读:如今,90、00后一代成为消费主力,补贴、打折、优惠等“价格战”已很难建立起忠诚度,如何与年轻人建立更深层次的情感共鸣?互动就是一种很好的方式,它能让用户更深度的参与品牌...

阿里云官方博客
今天
1
0
聊聊flink的Table API及SQL Programs

序 本文主要研究一下flink的Table API及SQL Programs 实例 // for batch programs use ExecutionEnvironment instead of StreamExecutionEnvironmentStreamExecutionEnvironment env = Stre......

go4it
今天
3
0
mysqldump应用

备份单个库/表数据或库/表结构 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 备份文件名 1、导出数据库为dbname的表结构(其中用戶名為root,密码为dbpasswd,生成的...

阿dai
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部