连接池的意义及阿里Druid

     建立数据库连接是相当耗时和耗费资源的,而且一个数据库服务器能够同时建立的连接数也是有限的,在大型的Web应用中,可能同时会有成百上千个访问数据库的请求,如果Web应用程序为每一个客户请求分配一个数据库连接,将导致性能的急剧下降。为了能够重复利用数据库连接,提高对请求的响应时间和服务器的性能,可以采用连接池技术。连接池技术预先建立多个数据库连接对象,然后将连接对象保存到连接池中,当客户请求到来时,从池中取出一个连接对象为客户服务,当请求完成后,客户程序调用close()方法,将连接对象放回池中。

     在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的close()方法,物理连接并没有关闭,数据源的实现只是删除了客户程序中的连接对象和池中的连接对象之间的联系。

第一部分:数据源的集中比较。

目前常用的数据源主要有c3p0、dbcp、proxool、druid,先来说说他们
Spring 推荐使用dbcp;
Hibernate 推荐使用c3p0和proxool
1、 DBCP:apache
DBCP(DataBase connection pool)数据库连接池。是apache上的一个 java连接池项目,也是 tomcat使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。dbcp没有自动的去回收空闲连接的功能。

2、 C3P0:
C3P0是一个开源的jdbc连接池,它实现了数据源和jndi绑定,支持jdbc3规范和jdbc2的标准扩展。c3p0是异步操作的,缓慢的jdbc操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有Hibernate,Spring等。c3p0有自动回收空闲连接功能。

3、 Proxool:Sourceforge
Proxool是一种Java数据库连接池技术。是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
综合来说,稳定性是dbcp>=c3p0>proxool

后来阿里巴巴的druid开源了,可以是前无古人后无来者,最强没有之一,是否的稳定,在大并发中表现十分好

今天来介绍的主要是监控,德鲁伊提供的这个监控组件,非常的便利,截图如下:

这是针对所有sql的监控,运行效率等等都能看到

对于url的监控,请求时间,并发等等,非常便利

当前数据源的配置信息也能够看到

监控session,这是我当前登录的

 

总的来说,这个数据源还是不错的,非常推荐,如今也已经到了1.0.23版本

复制代码
<!-- 连接池 阿里巴巴数据源 全世界最牛逼的data source 没有之一 -->

<druid.version>1.0.23</druid.version>

        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">dependency</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">groupId</span><span style="color:#0000ff;">&gt;</span>com.alibaba<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">groupId</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">artifactId</span><span style="color:#0000ff;">&gt;</span>druid<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">artifactId</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">version</span><span style="color:#0000ff;">&gt;</span>${druid.version}<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">version</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">dependency</span><span style="color:#0000ff;">&gt;</span></pre><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><strong><br><br><br>第二部分:详讲在普通项目中的配置。<br><br></strong></span></div></div>文章简介<div><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;line-height:22.383333206176758px;background-color:rgb(255,255,255);">Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQLParser。</span><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;background-color:rgb(255,255,255);line-height:22.383333206176758px;">Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQLServer、H2等等。</span><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;background-color:rgb(255,255,255);line-height:22.383333206176758px;">&nbsp;</span></div><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;line-height:22.383333206176758px;background-color:rgb(255,255,255);">Druid针对Oracle和MySql做了特别优化,比如Oracle的PSCache内存占用优化,MySql的ping检测优化。</span><strong><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;background-color:rgb(255,255,255);line-height:22.383333206176758px;">Druid在监控、可扩展性、稳定性和性能方面都有明显的优势。</span><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;background-color:rgb(255,255,255);line-height:22.383333206176758px;">Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。</span></strong><div style="text-indent:2em;"><strong><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;background-color:rgb(255,255,255);line-height:22.383333206176758px;"><br></span></strong></div><div style="text-indent:2em;"><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;background-color:rgb(255,255,255);line-height:22.383333206176758px;"><u>配置</u><strong>&nbsp;</strong></span><span style="font-weight:bold;text-indent:2em;"><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;background-color:rgb(255,255,255);line-height:22.383333206176758px;">&nbsp;</span></span></div><div style="text-indent:2em;"><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;line-height:22.383333206176758px;text-indent:0px;background-color:rgb(255,255,255);">为了方便大家迁移,Druid的配置和DBCP是基本一致的,如果你原来是使用DBCP,迁移是十分方便的,只需要把corg.apache.commons.dbcp.BasicDataSource修改为om.alibaba.druid.pool.DruidDataSource就好了。&nbsp;</span></div><div style="text-indent:0px;"><span style="text-indent:0px;background-color:rgb(255,255,255);">&lt;beanid="dataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="init"destroy-method="close"&gt;&nbsp;</span></div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="url"value="${jdbc_url}" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="username"value="${jdbc_user}" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="password"value="${jdbc_password}" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &nbsp;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="filters"value="stat" /&gt;</div><div style="text-indent:0px;">&nbsp;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="maxActive"value="20" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="initialSize"value="1" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="maxWait"value="60000" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="minIdle"value="1" /&gt;</div><div style="text-indent:0px;">&nbsp;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;propertyname="timeBetweenEvictionRunsMillis" value="60000"/&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;propertyname="minEvictableIdleTimeMillis" value="300000"/&gt;</div><div style="text-indent:0px;">&nbsp;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="validationQuery"value="SELECT 'x'" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="testWhileIdle"value="true" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="testOnBorrow"value="false" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;property name="testOnReturn"value="false" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &nbsp;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;propertyname="poolPreparedStatements" value="true" /&gt;</div><div style="text-indent:0px;">&nbsp;&nbsp; &lt;propertyname="maxPoolPreparedStatementPerConnectionSize" value="50"/&gt;</div><div style="text-indent:0px;">&lt;/bean&gt;</div><p><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;line-height:22.383333206176758px;">在上面的配置中,通常你需要配置url、username、password,maxActive这三项。</span></p><p><span style="font-family:Helvetica, Tahoma, Arial, sans-serif;line-height:22.383333206176758px;"><strong>第三部分druid的使用</strong></span></p><h2><a name="t0"></a><a target="_blank"></a>1:添加maven依赖</h2><p>&lt;dependency&gt;</p><p>&lt;groupId&gt;com.alibaba&lt;/groupId&gt;</p><p>&lt;artifactId&gt;druid&lt;/artifactId&gt;</p><p>&lt;version&gt;1.0.18&lt;/version&gt;</p><p>&lt;/dependency&gt;</p><p>&lt;dependency&gt;</p><p>&lt;groupId&gt;mysql&lt;/groupId&gt;</p><p>&lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;</p><p>&lt;version&gt;5.1.38&lt;/version&gt;</p><p>&lt;/dependency&gt;</p><span></span><h2><a name="t1"></a><a target="_blank"></a>2:添加一个资源配置文件(建议)</h2><p>&nbsp;&nbsp;&nbsp; driver=com.mysql.jdbc.Driver</p><p>url=jdbc:mysql:///wangjian?characterEncoding=UTF-8&amp;autoReconnect=true</p><p>username=root</p><p>password=1234</p><p>#最大连接数</p><p>maxActive=3</p><span></span><h2><a name="t2"></a><a target="_blank"></a>3:创建工厂类读取资源文件并创建javax.sql.DataSource的实例</h2><p>&nbsp;&nbsp;&nbsp; 需要先声明DruidDataSoure设置连接信息,其后再赋值给javax.sql.DataSource。完整代码如下:</p><p>Properties&nbsp;prop&nbsp;=&nbsp;new&nbsp;Properties();</p><p>prop.load(DSUtils.class.getResourceAsStream("pwd.properties"));</p><p>String&nbsp;driver&nbsp;=&nbsp;prop.getProperty("driver");</p><p>String&nbsp;url&nbsp;=&nbsp;prop.getProperty("url");</p><p>String&nbsp;username&nbsp;=prop.getProperty("username");</p><p>String&nbsp;password&nbsp;=&nbsp;prop.getProperty("password");</p><p>String&nbsp;maxActive&nbsp;=&nbsp;prop.getProperty("maxActive");</p><p>//声明DruidDataSource</p><p>DruidDataSource&nbsp;ds&nbsp;=&nbsp;new&nbsp;DruidDataSource();</p><p>ds.setDriverClassName(driver);</p><p>ds.setUrl(url);</p><p>ds.setUsername(username);</p><p>ds.setPassword(password);</p><p>ds.setMaxActive(Integer.parseInt(maxActive));</p><p>相信小伙伴位,在创建DruidDataSource以后,以然已经会使用了吧。哈哈~</p><span></span><h2><a name="t3"></a><a target="_blank"></a>4:对密码进行加密以后再保存到资源文件中并配置</h2><p>由于在资源文件中,配置了数据库明文密码,为了保护密码,可以使用Druid数据源密码加密的功能。</p><span></span><h3><a name="t4"></a><a target="_blank"></a>4.1、首先对密码进行加密获取一个publickey和加密后的密码</h3><p>执行以下命令:</p><p>&nbsp;C:/&gt;java&nbsp;–cp&nbsp;druid-1.0.18.jar&nbsp;com.alibaba.druid.filter.config.ConfigTools&nbsp;密码</p><p>上面的命令中,蓝线部分为随机生成的publickey,每次随机。红线中的为生成的密码。</p><span></span><h3><a name="t5"></a><a target="_blank"></a>4.2、将publickey和密码配置到资源文件中</h3><p>生成密码的命令:java&nbsp;-cp&nbsp;druid-1.0.18.jar&nbsp;com.alibaba.druid.filter.config.ConfigTools&nbsp;e234</p><p>driver=com.mysql.jdbc.Driver</p><p>url=jdbc:mysql:///wangjian?characterEncoding=UTF-8&amp;autoReconnect=true&amp;useSSL=false</p><p>username=root</p><p>#经过加密以后的密码</p><p>password=XSY9axcew83ZVNeZUmgrOPXwP0d3ZziFmqal4IZPAAJ4mpnwbouWiUaqD…</p><p>#最大连接数</p><p>maxActive=3</p><p>#生成的公钥</p><p>publicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANTxMV9TZYKpQCm7E+mEOhW0…</p><span></span><h3><a name="t6"></a><a target="_blank"></a>4.3、修改DruidDataSource实例化过程如下</h3><p>主要是添加publickey和经过加密的密码,并指定过虑器:</p><p>//读取资源文件</p><p>Properties&nbsp;prop&nbsp;=&nbsp;new&nbsp;Properties();</p><p>prop.load(DSUtils.class.getResourceAsStream("pwd.properties"));</p><p>String&nbsp;driver&nbsp;=&nbsp;prop.getProperty("driver");</p><p>String&nbsp;url&nbsp;=&nbsp;prop.getProperty("url");</p><p>String&nbsp;username&nbsp;=prop.getProperty("username");</p><p>String&nbsp;password&nbsp;=&nbsp;prop.getProperty("password");</p><p>String&nbsp;maxActive&nbsp;=&nbsp;prop.getProperty("maxActive");</p><p>String&nbsp;publickey&nbsp;=&nbsp;prop.getProperty("publickey");</p><p>//声明DruidDataSource</p><p>DruidDataSource&nbsp;ds&nbsp;=&nbsp;new&nbsp;DruidDataSource();</p><p>ds.setDriverClassName(driver);</p><p>ds.setUrl(url);</p><p>ds.setUsername(username);</p><p>ds.setPassword(password);</p><p>ds.setMaxActive(Integer.parseInt(maxActive));</p><p>//config:使用ConfigFilter解密,Stat:启动监控功能StatFilter</p><p>ds.setFilters("config,stat");</p><p>//设置解密使用的publickey</p><p>ds.setConnectionProperties("config.decrypt=true;config.decrypt.key="+publickey);</p><p>&nbsp;</p><span></span><h2><a name="t7"></a><a target="_blank"></a>5:配置监功能查看Druid数据源的监控信息</h2><p>配置Druid用于监控的Servlet如下:</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;DruidStatView&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;com.alibaba.druid.support.http.StatViewServlet&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;DruidStatView&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/druid/*&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>总结:</p><p>&nbsp;&nbsp;&nbsp;1:Druid数据源用维护连接对象是DruidDataSource&nbsp;。</p><p>&nbsp;&nbsp;&nbsp;2:可以通过ConfigTools对用户的密码进行加密。</p><p>&nbsp;&nbsp;&nbsp;3:可以通过配置的方式,监控SQL执行。</p><p>转载:https://blog.csdn.net/yanguo110/article/details/68944659</p><p><br></p>            </div>
            </div>
								
				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									if(typeof window.localStorage === "object" && typeof window.csdn.anonymousUserLimit === "object"){
										if(!window.csdn.anonymousUserLimit.judgment()){
											window.csdn.anonymousUserLimit.Jumplogin();
											return false;
										}else if(!currentUserName){
											window.csdn.anonymousUserLimit.updata();
										}
									}
									
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>
posted @ 2018-12-11 13:42  yang望星空  阅读(1150)  评论(0)    收藏  举报