数据库连接池-C3P0

c3p0连接池

0.9.jar
ComboPooledDataSource 它是DataSource子类。
Classpath:c3p0-config.xml(必须位于classpath根目录下)

第一步:导入c3p0包


第二步:在classpath目录下,创建一个c3p0-config.xml

建议复制一个更改
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- 默认配置,只可以出现一次 -->
	<default-config>
		<!-- 连接超时设置30秒 -->
		<property name="checkoutTimeout">30000</property>
		<!-- 30秒检查一次connection的空闲 -->
		<property name="idleConnectionTestPeriod">30</property>
		<!--初始化的池大小 -->
		<property name="initialPoolSize">2</property>
		<!-- 最多的一个connection空闲时间 -->
		<property name="maxIdleTime">30</property>
		<!-- 最多可以有多少个连接connection -->
		<property name="maxPoolSize">10</property>
		<!-- 最少的池中有几个连接 -->
		<property name="minPoolSize">2</property>
		<!-- 批处理的语句
		 -->
		<property name="maxStatements">50</property>
		<!-- 每次增长几个连接 -->
		<property name="acquireIncrement">3</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">
			<![CDATA[jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8]]>
		</property>
		<property name="user">root</property>
		<property name="password">1234</property>
	</default-config> 
</c3p0-config>


第三步:创建工厂类获取这个连接

public class DataSourceUtils {
	private static DataSource ds;
	static{
		ds = //默认的读取c3p0-config.xml中默认配置
				new ComboPooledDataSource();
	}
	public static DataSource getDatasSource(){
		return ds;
	}
	public static Connection getConn(){
		Connection con = null;
		try{
			con = ds.getConnection();//每一次从ds中获取一个新的连接
		}catch(Exception e){
			e.printStackTrace();
		}
		return con;
	}
}
这里补充下另外一种包装模式在使用前才包装 生成的时候不包装(性能会提升很多)
public class MyDataSource implements DataSource {
	private LinkedList<Connection> pool = new LinkedList<Connection>();
	public MyDataSource() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql:///db909?characterEncoding=UTf8";
			for (int i = 0; i < 3; i++) {
				//创建原生的连接,// com.mysql.jdbc.JDBC4Connection@8888
				Connection con = DriverManager.getConnection(url, "root",
						"");
//				****************************
//				原来是
//				MyConn conn=new MyConn(con);
//				pool.add(conn);
				pool.add(con);//将没有经过包装类放到池
//				****************************
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//此方法来自于datasource,用于返回一个连接
	public Connection getConnection() throws SQLException {
		synchronized (pool) {
			if (pool.size() == 0) {
				try {
					pool.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				return getConnection();
			}
			Connection con = pool.removeFirst();
			System.err.println("siize:" + pool.size());
//			***********************************
			//在返回之前包装这个类
			MyConn mc = new MyConn(con);
//			****************************
			return mc;
		}
	}

	// 以下包装connection
	class MyConn implements Connection {
		// 声明被包装类的成员
		private Connection conn;

		// 通过构造接收MySql的connection的对象JDBC4Connection@8888
		public MyConn(Connection con) {
			this.conn = con;
		}
		//关闭连接
		public void close() throws SQLException {
			synchronized (pool) {
				//有人调用了关闭方法,不能关
				System.err.println("有人还连接了。。。。"+this);
//**********************************************这里不能是add(this)
				pool.add(conn);
//****************************************
				pool.notify();
			}
		}}}

ComboPooledDataSource有三个构造:
没有参数的.
接收一个boolean
默认的情况下,为
true,即所有connection.autoCommit属性为true.而且为你初始化你没有设置的其他值

接收一个字符串的
在一个c3p0-config.xml文件中中,可以配置多种连接。 除了默认连接,其他都叫命名的连接。通过
<named-config name=”xxxx”/>

static{
		ds = 	new ComboPooledDataSource("db909");
	}


其中必须手动设置的配置有

	<!--初始化的池大小 -->
		<property name="initialPoolSize">2</property>
	<!-- 最多可以有多少个连接connection -->
		<property name="maxPoolSize">10</property>
	<!-- 最少的池中有几个连接 -->
		<property name="minPoolSize">2</property>
	<!-- 批处理的语句
		 -->
		<property name="maxStatements">50</property>

		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">
			<![CDATA[jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8]]>
		</property>
		<property name="user">root</property>
		<property name="password">1234</property>

INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 30000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 306nod8zpo8rl21muvlc9|3813c, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 306nod8zpo8rl21muvlc9|3813c, idleConnectionTestPeriod -> 30, initialPoolSize -> 2, jdbcUrl -> jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 30, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 5, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 2, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]这些值都可以配置

总结:

C3p0连接池,只有当用户获取连接时,才会包装Connection。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值