数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
为什么要使用连接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次 *** 作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
使用proxool数据库连接池步骤:在WEB-INF的lib中导入proxool-0.9.0RC3.jar
在WEB-INF中新建一个XML文件,取名为proxool.xml
在proxool.xml中的内容如下:
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<!--
the proxool configuration can be embedded within your own application's. Anything outside the "proxool"
tag is ignored.
-->
<something-else-entirely>
<proxool>
<alias>smms</alias><!--数据源的别名-->
<driver-url>jdbc:mysql://127.0.0.1:3306/smms</driver-url><!--url连接串-->
<driver-class>com.mysql.jdbc.Driver</driver-class><!--驱动类-->
<driver-properties>
<property name="user" value="root" /><!--用户名-->
<property name="password" value="root" /><!--密码-->
</driver-properties>
<!--最大连接数(默认 5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由
maximum-new-connections决定-->
<maximum-connection-count>100</maximum-connection-count>
<!--最小连接数(默认2个)-->
<minimum-connection-count>10</minimum-connection-count>
<!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默
认30秒-->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-
->
<maximum-new-connections>10</maximum-new-connections>
<!--最少保持的空闲连接数(默认2个)-->
<prototype-count>5</prototype-count>
<!--在使用之前测试-->
<test-before-use>true</test-before-use>
<!--用于保持连接的测试语句 -->
<house-keeping-test-sql>select id from t_sysadmin</house-keeping-test-sql>
</proxool>
</something-else-entirely>
在web.xml中添加以下节点:
[html] view plaincopy
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
t/servlet>
数据库 *** 作类如下:
[java] view plaincopy
package cn.edu.hbcit.smms.dao.databasedao
import java.sql.Connection
import java.sql.DriverManager
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import org.apache.log4j.Logger
import org.logicalcobwebs.proxool.ProxoolException
import org.logicalcobwebs.proxool.ProxoolFacade
import org.logicalcobwebs.proxool.admin.SnapshotIF
/**
* 数据库 *** 作类
* @author lw
*
*/
public class DBConn {
private static Connection conn
private static ResultSet rs
private static PreparedStatement ps
private static String driverClass = "org.logicalcobwebs.proxool.ProxoolDriver"//proxool驱动类
//private static String url = "jdbc:mysql://localhost:3306/bbs?user=root&password=123"
private static int activeCount = 0//活动连接数
protected final Logger log = Logger.getLogger(DBConn.class.getName())
/**
* 获取数据库连接
* @return Connection
*/
public Connection getConn() {
try {
Class.forName(driverClass)
conn = DriverManager.getConnection("proxool.smms")//此处的smms是在proxool.xml中配置的连接池别名
this.showSnapshotInfo()//查看连接池信息
} catch (Exception e) {
log.error(e.getMessage())
log.debug("数据库连接错误!")
//System.out.println(e.getMessage())
//System.out.println("数据库连接错误!")
}
return conn
}
/**
* 释放连接
* freeConnection
* @param conn
*/
public void freeConnection(Connection conn){
if(conn!=null){
try {
conn.close()
} catch (SQLException e) {
e.printStackTrace()
}
}
}
/**
* 获取连接池中的连接信息
*/
private void showSnapshotInfo(){
try{
SnapshotIF snapshot = ProxoolFacade.getSnapshot("smms", true)
int curActiveCount=snapshot.getActiveConnectionCount()//获得活动连接数
int availableCount=snapshot.getAvailableConnectionCount()//获得可得到的连接数
int maxCount=snapshot.getMaximumConnectionCount() //获得总连接数
if(curActiveCount!=activeCount)//当活动连接数变化时输出的信息
{
log.debug("活动连接数:"+curActiveCount+"(active);可得到的连接数:"+availableCount+"(available);总连接数:"+maxCount+"(max)")
//System.out.println("活动连接数:"+curActiveCount+"(active);可得到的连接数:"+availableCount+"(available);总连接数:"+maxCount+"(max)")
activeCount=curActiveCount
}
}catch(ProxoolException e){
e.printStackTrace()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)