刨根问底(Proxool连接池设置)
?
今天才真正体会到刨根问底对于对于做技术也是同样的重要。
?
一起,心里也懂得其重要性,但是也只是停留在懂得的基础上,在实现功能时,往往只是停留在表面,功能作出来就行。
?
而很多问题没有清晰的知其根底,
?
为什么这样做?这样做的好处坏处?原来错的现在为什么没有错了?还有一些概念性的东西也只是停留在表面?
?
比如说连接池,表面的意思是有很多数据库的链接,用时就从其中取出来使用,而不需求重新开启链接。
?
但是之前从来没有自我,连接池到底是解决什么问题?没有连接池会出现什么问题?
?
这些问题,如果能自我的解释,那有些问题就迎刃而解了。
?
习惯:刨根问底
?
做技术时,碰到自己不理解,或者碰到新的技术时,要常问常思考。
?
这个技术为什么而存在?
?
为了解决什么问题?
?
道理可能大家都懂,但懂不代表理解,不代表会用。
?
?
????????? <something-else-entirely> ?? ??
??????????????????????? <proxool> ??? ????? ?????
????????????????????????? <alias>Develop</alias> ???? ?????
????????????????????????? <driver-url>jdbc:mysql://localhost/kuanxue</driver-url>
?????????????????????????? <driver-class>com.mysql.jdbc.Driver</driver-class>
?????????????????????????? <driver-properties> ????? ???????????????? ????????????
???????????????????????????????????? <property value="root"/> ????? ???????????????? ???????????
?????????????????????????????????????? <property value=""/> ????? ???????????????? ???????????
?????????????????????????????????????? <property value="true"/> ????? ???????????????? ???????????
????????????????????????????????????? <property value="GBK"/> ??? ?????? ?????
??????????????????????????? </driver-properties> ??? ????
?????????????????????????? <!--自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->
?????????????????????????? <house-keeping-sleep-time>90000</house-keeping-sleep-time> ????
?????????????????????????? <!--最少保持的空闲连接数--> ?????
?????????????????????????? <prototype-count>5</prototype-count> ?????
???????????????????????? <!--允许最大连接数,超过了这个连接,再有请求时,就排在队列中--> ?????
????????????????????????? <maximum-connection-count>1000</maximum-connection-count> ?????
????????????????????????? <!--最小连接数--> ?????
?????????????????????? <minimum-connection-count>10</minimum-connection-count> ?????
???????????????????????? <!--最大的等待请求数,即因没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的 用户连接就不会被接受--> ?????
??????????????????????? <proxool.simultaneous-build-throttle>200</proxool.simultaneous-build-throttle> ????? ???
???????????????????????? <!--Test SQL(SELECT getDate()) --> ????? ???
???????????????????????? <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql> ??
?????????????????? </proxool>
???????????? </something-else-entirely>
3、配置web.xml 在web.xml中增加:
<! -- 配置初始化servlet,在web容器加载的时候自动加载配置文件,如果不是web程序,这个部分就需要通过开发接口来初始化了 -->
?? <servlet> ????
????????? <servlet-name>proxoolInitialServlet</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> ??
</servlet>
<!--配置监控servlet,其实如果不想监控的话,可以不配--> ??
<servlet> ??
????????? <servlet-name>dbpoolAdmin</servlet-name> ???
?????????? <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet> ??
<servlet-mapping> ???
??????????? <servlet-name>dbpoolAdmin</servlet-name> ???
???????????? <url-pattern>/dbpool</url-pattern>
</servlet-mapping>
4、在程序中调用 一般我将获取connection的行为封装为一个工厂模式,便于多种情况的切换,以下是其中proxool数据源的getConnection方法的实现:
public Connection getConnection() { ??????? ???
??????????? try{ ??????????? ????????????? ??
?????????????????? Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); ??????????? ?????????????? ???????????
???????????????????? return DriverManager.getConnection("proxool.Develop"); ??????? ???? ??????
????????????? }catch(Exception ex){ ??????????? ????????????
??????????????????????? ex.printStackTrace(); ?????? ?? ??????
?????????????? } ??????? ?? ?????
??????????????????????????? return null; ???
}
5、应用开发: ????? 在实际的应用中,我们可能需要更多的功能,比如监控功能不够强大,权限不好控制,我们希望能够编写出更强大的功能,比如杀死一些大的查询语句等,记录各种查询语句占用的时间,这就需要对开发接口进行进一步的研究了。
----------------------------------------------------
最近做的一个项目中运用到了连接池技术,可能我们大家比较熟悉的开源连接池有dbcp,c3p0,proxool。对这三种连接池来说,从性能和出错率来说,proxool稍微比前两种好些。今天我主要简单的讲述一下,我在项目中成功的配置和源码。
???????第一步:首先去http://proxool.sourceforge.net/下载一个proxool.jar文件了,我用的是proxool-0.8.3.jar,现在最新版本是proxool-0.9.3.jar.除了他们的查看监控台的页面有变化,其他的变化不是太大。
??????? 第二步:就是写一个单独的proxool.xml文件放到WEB-INF文件夹下。我用的数据库是MySQL.
??? peoxool.xml的配置文件如下:
??? <?xml version="1.0" encoding="UTF-8"?>
??? <proxool-config>
??? <proxool>
??? <alias>db</alias>
??? <driver-url>jdbc:mysql://×××.×××.××.×××:3303/mydb<driver-url>
??? <driver-class>com.mysql.jdbc.Driver</driver-class>
??? <driver-properties>
??? <property value="root" />
??? <property value="*******" />
??? </driver-properties>
??? <house-keeping-sleep-time>90000</house-keeping-sleep-time>
??? <maximum-new-connections>20</maximum-new-connections>
??? <prototype-count>5</prototype-count>
??? <maximum-connection-count>1000</maximum-connection-count>
??? <minimum-connection-count>10</minimum-connection-count>
??? </proxool>
??? </proxool-config>
???? 对以上配置简单的解释:
??? 1.<alias> :为该连接池起一个别名,在其他文件中引用。引用是:(proxool.db);
??? 2. <driver-class>com.mysql.jdbc.Driver</driver-class>
???? <driver-properties>
???? <property value="root" />
???? <property value="root" />
??? </driver-properties>
??? 这些配置大家应该比较熟悉吧。配置数据库的驱动和连接。
??? 3.<house-keeping-sleep-time> :proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁。
??? 4.<maximum-new-connections>: 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受。
??? 5.<prototype-count>:最少保持的空闲连接数。
??? 6.<maximum-connection-count>: 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定
??? 7.<minimum-connection-count>:最小连接数
??? 第三步:加载并初始化proxool.xml文件。因为它是连接数据库的,其他很多模块都用到数据,所以你必须首先加载它,在web.xml中进行如下配置:如果你以前加载applicationContext.xml用的是:
??? <listener>
??? <listener-class>
??? org.springframework.web.context.ContextLoaderListener
??? </listener-class>
??? </listener>
??? 这时你必须换成如下配置:
??? <servlet>
??? <servlet-name>contextConfigLocation</servlet-name>
??? <servlet-class>
??? org.springframework.web.context.ContextLoaderServlet
??? </servlet-class>
??? <load-on-startup>2</load-on-startup>
??? </servlet>
??? 要不然你就会遇见这样的错误:
??? Problem
??? org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its
??? alias 'db'
????? 如果用过proxool与spring整合时,不少就遇到过这样的问题,其实这个问题很明显就是你的proxool.xml没有被先加载初始化,我们应该让它先加载,应该这样配置:
??? <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>
??? </servlet>
??? 越??????? out.print(name);
??????? out.println("</td>");
??????? if (value != null) {
??????????? out.print("????? <td style=\"" + STYLE_DATA + "\">");
??????????? out.print(new String(value.getBytes("ISO-8859-1"),"utf-8"));
??????? } else {
??????????? out.print("????? <td style=\"" + STYLE_NO_DATA + "\">off");
??????? }
??????? out.print("</td>");
??????? out.println("??? </tr>");
??? }
??? 上面红色的部分就是我改的部分,然后把web.xml中的
??? <servlet-class>
??? com.jack.servlet.AdminServlet
??? </servlet-class>
??? 中<servlet-class>换成你改写的那个类。
??? 最后一步:整合spring和proxool。在applicationContext.xml文件中把原来数据源的配置成这样:
??? <bean>
??? <property >
??? <value>org.logicalcobwebs.proxool.ProxoolDriver</value>
??? </property>
??? <property >
??? <value>proxool.db</value>
??? </property>
??? </bean>
??? 这个 <property >要配置成proxool.xml中的别名。其他地方不用该了。也可以与hibernate整合。
与spring整合比较简单。我采用的就是上面的配置方式。
??? 这样就配置完了,很清晰,很简单。如果查看监控情况的话:
??? http://www.××××.com/admin 就可以查看了,如果你是本地测试:改一下路径就可以了。
??? 上面所讲述的是一个成功的配置,并在项目中成功的运用了。希望对连接池有爱好的朋友有所帮助。
------------------------------------------------------
1、将数据库链接使用的JDBC库文件和连接池使用的proxool.jar库文件放入项目中。2、配置proxool.xml文件,兴建一个proxool.xml文件放在项目的WEB-INF,也就是web.xml所在的地方。????? proxool.xml配置具体如下:(以MS SQL的配置为例)<?xml version="1.0" encoding="UTF-8"?><proxool>
<alias>connection-MySQL</alias> //proxool名称,这个可以自己取一个
<driver-url>jdbc:microsoft:sqlserver://<serverName>:1433;databaseName=<databaseName></driver-url> //JDBC链接的URL
<driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class> //JDBC驱动名称
<statistics>1m,15m,1d</statistics> //此处可以不用管
<driver-properties>
<property value="数据库用户名" /> //数据库用户名
<property value="数据库用户密码" /> //数据库用户名密码
</driver-properties>
<maximum-connection-count>100</maximum-connection-count> //连接池最大链接数
<minimum-connection-count>25</minimum-connection-count> //连接池最小连接数
<maximum-active-time>60000</maximum-active-time> //单个连接最大存活时间
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql> //测试数据库连接,此处可以不用管
</proxool>说明一下,不管你是使用何种数据库,这种方法都适用,只需要更改JDBC链接和驱动名称就可以了3、配置Web.xml??? proxool既然配置完成如何使用呢???? 打开你的web.xml文件添加如下代码:<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>??????//proxool.xml存放位置
??? </init-param>
??? <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
??? <servlet-name>proxool</servlet-name>
??? <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
??? </servlet>
<servlet-mapping>
??? <servlet-name>proxool</servlet-name>
??? <url-pattern>/proxool</url-pattern>
</servlet-mapping>这样配置之后使用proxool就可以了,具体使用如下:4、使用数据库连接池。import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;/**
* @author Sunmask
*
*/
public class DBMain {
private String xml = "proxool.connection-MSSQL";??????//这个就是proxool名称需要用到的地方
private Connection con = null;
private PreparedStatement pst = null;
/**
* 从连接池获得数据库链接
* @param sqlStr
* @return
* @throws SQLException
*/
public PreparedStatement getPreparedStatement(String sqlStr) throws SQLException
{
?? con = DriverManager.getConnection(xml);
?? pst = con.prepareStatement(sqlStr);
?? return pst;
}
/**
* 释放数据库连接
* @throws SQLException
*/
public void release() throws SQLException
{
?? con.close();
}}
?
?
1 楼 ljhard_1030 2011-08-14 楼主学习了,以后继续发表这类的文章,会继续光临的。。