如果想要搭建一个高效的网站,链接池是必须用到的一部分。而连接池的选择是多种多样的。就现在的软件开发界而言,最为多用的是DBCP, c3p0, 和 proxool。而hibernate推荐使用的是c3p0 和proxool,并且宣布不再支持DBCP。 因此,重点就是如果想要在自己的应用程序中加入数据库连接池,就必须掌握其中的一种,而最好得选择就是c3p0和proxool中的任何一种。
下面来说说数据库连接池的相关概念和基本原理,以便于读者更加容易的理解后边的实际应用。
使用过数据库操作的人都知道,当我们需要进行数据库操作时,首先需要对数据库进行连接,然后执行操作,再然后我们使用完毕后需要将数据库关闭。如果在使用后没有关闭数据库连接,那么,这个连接就一直在占用状态。当使用的人数增加,连接也增加,系统会很快就崩溃。在超过负荷之后直接down掉!!!这就是在程序中没有及时的关闭数据库连接的危害。但是,这种每使用一次就连接和关闭一次数据库连接其实际上是对数据库有一定的影响的。因此,才有了数据库连接池的概念。
数据库连接池实际上就是在程序加载时就按照设置的数量先和数据库建立一定量的连接,当需要数据库连接时就直接从最开始建立的连接中取得所需要的连接就行。当不需要时,只需要将连接还给连接池;当建立的连接被取用完后,并且还存在后续的请求,也就是说现在的连接数量已经超过了系统设置的最大连接数。那么,后面的请求只有等待!!
百度给出的解释是:
作者:itRed 邮箱:it_red@sina.com 博客:http://www.cnblogs.com/itred
在进行正式开放之前,了解一下几个专用术语:
maximum-connection-count:最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定
minimum-connection-count:最小连接数(默认2个)
house-keeping-sleep-time:proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒
maximum-new-connections:没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受
prototype-count :最少保持的空闲连接数(默认2个)
test-before-use:在使用之前测试
house-keeping-test-sql:用于保持连接的测试语句
好了!看看具体的实例应用就会明白以上所说的相关概念了。本人按java和web工程来叙述案例,需要声明一下,proxool的应用是没有固定的形式了。并不是只能在java中应用它的xml形式。它的配置可以以任何形式运行。具体的看它的官方文档。本人主要以理解为首,开发为主。因此以web和java工程区分。
先说一下数据库的数据
Demo 1. 在java工程中添加proxool连接池
一.新建java工程,在目录下直接见一个lib包,用来存放项目工程所有的jar包,导入相关的jar包,然后build path。利用proxool实现连接池的jar包如下:
二. 在src目录下新家一个测试包,附加一个测试类Test.java:
包名:com.red.test
Test.java的源码如下:
package com.red.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import org.logicalcobwebs.proxool.configuration.JAXPConfigurator; public class Test { public static void main(String[] args) throws Exception { Test obj = new Test(); obj.test2(); } int beginIndex = 0; int endIndex = 10; //取10条记录 String MySQLdbTableName = "user"; String MySQLreq = "select * from " + MySQLdbTableName + " limit " + beginIndex + ", " + endIndex; public void test2() throws Exception { // Java应用中先要加载配置文件,否则谁知道你配置给谁用的 JAXPConfigurator.configure("src/proxool.xml", false); // 1:注册驱动类,这次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动 Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); // 2:创建数据库连接,这个参数是一个字符串,是数据源的别名,在配置文件中配置的timalias,参数格式为:proxool.数据源的别名 Connection conn = DriverManager.getConnection("proxool.mysql"); for (int i = 0; i < 20; i++) conn = DriverManager.getConnection("proxool.mysql"); Statement stmt = conn.createStatement(); ResultSet res = stmt.executeQuery(MySQLreq); ResultSetMetaData rsmd = res.getMetaData(); int columnCount = rsmd.getColumnCount(); int rowCount = 0; while (res.next()) { System.out.print(rowCount + " "); rowCount++; for (int j = 1; j <= columnCount; j++) { String strRes = res.getString(j); System.out.print(strRes + "|\t"); } System.out.println(); } conn.close(); } }