??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美精品在线观看一区二区,亚洲va天堂va国产va久,在线日韩电影http://www.aygfsteel.com/titanaly/category/39909.htmlzh-cnWed, 28 Jul 2010 08:23:55 GMTWed, 28 Jul 2010 08:23:55 GMT60可用Jamon来监你的Spring应用,sql执行效率(?http://www.aygfsteel.com/titanaly/archive/2010/07/28/327330.html不高?/dc:creator>不高?/author>Wed, 28 Jul 2010 08:06:00 GMThttp://www.aygfsteel.com/titanaly/archive/2010/07/28/327330.htmlhttp://www.aygfsteel.com/titanaly/comments/327330.htmlhttp://www.aygfsteel.com/titanaly/archive/2010/07/28/327330.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/327330.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/327330.html *作者:(x)张荣?ahuaxuan)
*2007-8-15
*转蝲h明出处及(qing)作?
*/

前两天在看Spring内置的拦截器的时候,发现?jin)一个之前没有注意的c:(x)org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptorQ好奇心(j)?j)我上|查?jin)一下这个jamon。大概看?jin)一下之后发现这个玩意还真挺好用的而且挺重要的Q而且现在国内对它的介l也很少Q所以写?jin)一文章和大家分n?

一QJamon介:(x)
Jamon的全名是QJava Application Monitor。它是一个小巧的Q免费的Q高性能的,U程安全的性能监测工具。它可以用来定pȝ的性能瓉Q也可以用来监视用户和应用程序之间的交互情况?Jamon主要是用来检jee的应用程序。它最新的版本?.1Q可以用?.4以上的jdk上?

二,jamon导入C的应用程序中?
首先下蝲jamon的开发包Q见我的附gQ同时你也可以去Sourceforge上自׃载。Sourceforge的下载地址为http://jamonapi.sourceforge.net。解压之后可以得C个jar包和一个war包。jar包是自己?x)用到的Q而war包是一个例子(不要看q个例子Q待?x)也要把它导入到目中?j)。把war包之间丢到服务器上,讉KQlocalhost:8080/jamon可以看到这个例子了(jin)Q这个例子是一个简单的性能监控pȝ?

接着把例子中的所有的包都导入到项目中Qƈ把war包中的jsp和imagesq有css都考到目中,比如新徏一个目录叫monitorQ它和W(xu)EB-INF是同U目录)(j)?

三,正确配置自己的应?
我们在性能监测的时候最监测的就是页面的讉K率和cMҎ(gu)的访问率。所以在q一部分主要讲解一下如何监自q面和类中方法的讉K?

1Q?(g)自q面讉K?
首先我们需要在web.xml中添加一个filterQ这个filter是用来判断哪些面需要被监视的,如下所C:(x)
Java代码 复制代码
  1. <filter>   
  2.         <filter-name>JAMonFilter</filter-name>   
  3.         <filter-class>com.easywebwork.filter.EasyPageMonFilter</filter-class>   
  4.     </filter>   
  5.     <filter-mapping>   
  6.         <filter-name>JAMonFilter</filter-name>   
  7.         <url-pattern>/*</url-pattern>   
  8.     </filter-mapping>  
接下来我们看看这个filter的写法:(x)
Java代码 复制代码
  1. /**  
  2.  * @author 张荣华(ahuaxuanQ? 
  3.  *  
  4.  * @since 2007-8-13  
  5.  */  
  6. public class PageMonFilter extends JAMonFilter{   
  7.   
  8.     private static final long serialVersionUID = 5746197114960908454L;   
  9.   
  10.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {   
  11.          Monitor allPages = MonitorFactory.start(new MonKeyImp("org.easywebwork.allPages",getURI(request),"ms."));   
  12.          //q里是我们要监视的所有的面的配|?  
  13.          Monitor monitor = MonitorFactory.start(getURI(request));   
  14.          //q里是我们要监视的某个面的配|?  
  15.          try {   
  16.           filterChain.doFilter(request, response);   
  17.          } finally {   
  18.           monitor.stop();   
  19.           allPages.stop();   
  20.          }   
  21.        }   
  22.   
  23.        protected String getURI(ServletRequest request) {   
  24.          if (request instanceof HttpServletRequest) {   
  25.            return ((HttpServletRequest) request).getRequestURI();   
  26.          }  else {   
  27.            return "Not an HttpServletRequest";   
  28.          }   
  29.        }   
  30.   
  31.        private FilterConfig filterConfig = null;   
  32.           
  33. }}  

q个cȝ上去很简单,其实也挺单的Q就是得到uriQ然后把它注册到MonitorFactorycM。这样只要我们去讉K刚才创徏的monitor目录下的jsp可以看到性能监测面?jin)?

2Q?Q接下来我们看看在用spring的情况下如何监测一个bean的方法调用。Spring也提供了(jin)对Jamon的支?spring支持的东西还真多?Q也是文章开头提出的那个拦截器,Z(jin)l我们的bean加上拦截器,我们在spring的applicationcontext配置文g中加入如下语句:(x)
Java代码 复制代码
  1. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
  2.         <property name="beanNames">   
  3.             <list>   
  4.                 <value>userService</value>                 
  5.             </list>   
  6.         </property>   
  7.         <property name="interceptorNames">   
  8.             <list>   
  9.                 <value>jamonInterceptor</value>   
  10.             </list>   
  11.         </property>   
  12.     </bean>   
  13.        
  14.     <bean id="jamonInterceptor" class="org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor">   
  15. </bean>  

上面q个是典型的spring的aop的配|,如果对spring的aop配置不了(jin)解的可以ȝ一下spring中文文档Q当然如果不想了(jin)解的话即使直接把q段配置拷到自己的项目中也是可以直接使用的?

q有一个步骤就是在你的log4j.properties中加入这句代码:(x)
Java代码 复制代码
  1. log4j.logger.org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor = TRACE  

如果没有q一行,那么q个拦截器是不会(x)把方法调用的信息向MonitorFactory注册的?

只需要这些步骤,userservice中的Ҏ(gu)在调用的时候就可以被拦截,然后其注册到MonitorFactory中去?jin)?

所有的配置完成之后我们来看一下效果吧:
http://www.javaeye.com/topics/download/b2bac96e-6c18-4340-b7e0-f84c7bb6adca从这个图上我们可以看刎ͼ所有页面被讉K的次敎ͼUserService中的getAllUsers被调用的ơ数Q最双的是讉K旉。这只是整个囄一部分Q当然这个页面中也包括每一个页面被讉K的次数和W一ơ访问的旉{等。下载附件运行,可以看到所有的面?jin)?

三,ȝ
Ҏ(gu)以上的步骤,我们可以监我们的E序?jin),应用E序中哪些页面被讉K的多Q哪些页面被讉K的少Q哪些方法被讉K的多Q哪些方法被讉K的少Q以?qing)访问高峰期集中在什么时间等{,有了(jin)q些参数Q我们更可以有针Ҏ(gu)的对应用程序进行优化了(jin)Q比如说某个面讉K比较频繁Q我可以用ehcache或oscachel这个页面做一个缓存。如果某个方法的讉K比较频繁那就看看q个Ҏ(gu)能否q一步优化,是需要异步,q是需要缓存,q是需要其他等{,M有了(jin)jamon可以l我们带来更多的便捷Q既可以让我们知道我们的客户的行为,也可以让我们知道我们开发的E序?#8220;能力”?

其实本文提供的只是对面和方法调用的监控Q但是jamon可以提供更多功能Q比如说sql语句的监控等{,q就需要我们共同去发掘?sh)(jin)?

附g中包括了(jin)一个easywebwork的例子,我把jamon导入到这个例子工E中去,大家可以直接下蝲q行观看效果。Easywebwork是一个旨在减webwork2.2.xpd的xml配置文g的项目,
如果对这个主题感兴趣请到
http://www.javaeye.com/topic/91614
http://www.javaeye.com/topic/93814
参加讨论?





之前有一文章讲到如何用jamon来监控请求以?qing)方法得调?原文地址见:(x)[url]http://www.javaeye.com/post/354575 [/url])Q本文属于其姊妹,使用jamon监控pȝ的sql调用?qing)其调用效率?

需求:(x)
1我们知道在用hibernate得时候,我们可以打开show sql选项Q可以直接查看sql语句调用的情况,那么当我们用其他持久技术的时候我们也需要这个功能怎么办呢Q没有关p,jamon能够帮我们做到?

2 很多时候,不同的程序员?sh)(x)写Z同的性能的sqlQ有时候可能会(x)不小?j)或者因Z知道而写出性能很差的sqlQ我自己曄发生过q种事情Q在500w条数据的表里使用?jin)一个limit来分,到后面,执行一条sql都需要几分钟Q诸如此cȝ时候可能大安有碰到过Q如果能有监控sql性能的工具嵌在应用里该多好,当然有jamon可以帮我们做到?

对于jamon来说Q每一个query的执行之后的l计l果都会(x)被保存(sh)来,q些概要l计都以MonProxy-SQL开头。这些统计中包括查询执行的时_(d)有比如^均时_(d)执行L_(d)最执行时_(d)最大执行时_(d)q些东西N不是我们正想要的吗?

那么让我们开始吧Q我们知道,q些query执行的统计应该是在connection中被l计的,也就是说我们要代理一般的connectionQ而connection又是由datasource产生的,所以我们可以代理datasourceQ说q就qӀ?

一个datasource接口中关于connection的方法只有两个:(x)
Java代码 复制代码
  1. /**  
  2.    * <p>Attempts to establish a connection with the data source that  
  3.    * this <code>DataSource</code> object represents.  
  4.    *  
  5.    * @return  a connection to the data source  
  6.    * @exception SQLException if a database access error occurs  
  7.    */  
  8.   Connection getConnection() throws SQLException;   
  9.          
  10.   /**  
  11.    * <p>Attempts to establish a connection with the data source that  
  12.    * this <code>DataSource</code> object represents.  
  13.    *  
  14.    * @param username the database user on whose behalf the connection is   
  15.    *  being made  
  16.    * @param password the user's password  
  17.    * @return  a connection to the data source  
  18.    * @exception SQLException if a database access error occurs  
  19.    * @since 1.4  
  20.    */  
  21.   Connection getConnection(String username, String password)    
  22.     throws SQLException;  

也就是说我们只要overrideq两个方法即可?
Ҏ(gu)q个思\我写?jin)以下代码?x)
Java代码 复制代码
  1. /**  
  2.  * @author ahuaxuan(aaron zhang)  
  3.  * @since 2008-2-25  
  4.  * @version $Id$  
  5.  */  
  6. public class MonitorDataSource implements DataSource {   
  7.     public DataSource realDataSource;   
  8.   
  9.     public void setRealDataSource(DataSource realDataSource) {   
  10.         this.realDataSource = realDataSource;   
  11.     }   
  12.   
  13.     public DataSource getRealDataSource() {   
  14.         return realDataSource;   
  15.     }   
  16.     public Connection getConnection() throws SQLException {   
  17. //表示由jamon来代理realDataSourceq回的Connection   
  18.         return MonProxyFactory.monitor(realDataSource.getConnection());   
  19.     }   
  20.   
  21.     public Connection getConnection(String username, String password)   
  22.             throws SQLException {   
  23. //表示由jamon来代理realDataSourceq回的Connection   
  24.   
  25.         return MonProxyFactory.monitor(realDataSource.getConnection(username,   
  26.                 password));   
  27.     }   
  28. }  

昄q个一个代理模式。接下来是生成q个代理c?我是在spring中注册了(jin)q么一个类Q?
Java代码 复制代码
  1. <bean id="writeMonitorDataSource" class="org.ahuaxuan.MonitorDataSource" destroy-method="close">   
  2.         <property name="realDataSource" ref="writeDataSource"/>   
  3.     </bean>  


writeMonitorDataSource 所依赖的writeDataSource是我们真正配置的datasourceQ比如:(x)
Java代码 复制代码
  1. <bean id="writeDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">   
  2.         <property name="driverClassName">   
  3.             <value>${jdbc.driverClassName}</value>   
  4.         </property>   
  5.         <property name="url">   
  6.             <value>${jdbc.url}</value>   
  7.         </property>   
  8.         <property name="username">   
  9.             <value>${jdbc.username}</value>   
  10.         </property>   
  11.         <property name="password">   
  12.             <value>${jdbc.password}</value>   
  13.         </property>   
  14.         <property name="maxActive">   
  15.             <value>${jdbc.maxActive}</value>   
  16.         </property>   
  17.         <property name="maxIdle">   
  18.             <value>${jdbc.maxIdle}</value>   
  19.         </property>   
  20.         <property name="maxWait">   
  21.             <value>${jdbc.maxWait}</value>   
  22.         </property>   
  23. </bean>  

好了(jin)Q那么在使用datasource的时候,我们应该用哪个呢Q当然是writeMonitorDataSourceq个里,我们可以把它注入ljdbcTemplateQ或者sessionfactoryQ或者其他需要用到datasource的地斏V?

到这里,׃切准备完毕了(jin)Q我们可以看看我们sql语句的执行效率了(jin)(q个面的地址为sql.jsp)Q?
见图1
当然要我们的应用能够昄q个面Q我们需要把jamon的一l页面拷到我们的应用中,q一l页面包含在我提供下载的包中Q最新的jamon版本?.7?

我们可以看到id?53的那条sql语句执行?8msQ我要去看看q条sql语句是不是有点什么问题或者是否有优化的可能性?

当然Q刚才说到每一条sql语句都是有统计^均时_(d)最大最执行时间等{,没错Q在另外一个页面jamonadmin.jsp上就包含q些内容
见图2
      

上面的图片代表hits表示执行ơ数Qavg表示sql执行的^均时_(d)后面的min和max表示sql执行的最耗时和最大耗时。从q里我们能够更直观的看到我们每条sql语句执行的情c(din)很有用的一个功能?

而且在上面那两个面上,我们q可以选择把sql执行的结果导出来Q可以导成xml或excel格式?

ȝQ用jamon来监控我们的sql语句我觉得很有用意义,而且使用jamonҎ(gu)们的应用来说完全是松耦合的,Ҏ(gu)不需要更Ҏ(gu)们的业务逻辑代码Q完全是可插拔的Q我们也可以开发时使用jamonQ部|时拔掉jamon。有?jin)它能够使一些程序员能够更多一点的x(chng)自己所写的sql的效率,当然如果之前开发的时候没有用jamon也没有关p,即上线后也可以查看一下sql语句是否有问题,比如哪些sql语句执行得比较频J,是否存在l其做缓存得可能性等{。M使用jamon在应用程序中来监控我们得sql语句h很强得实用意义,

再次ȝQjamonQ很好,很强大?


]]>
C3P0q接池详l配|?/title><link>http://www.aygfsteel.com/titanaly/archive/2009/08/11/290696.html</link><dc:creator>不高?/dc:creator><author>不高?/author><pubDate>Tue, 11 Aug 2009 09:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/titanaly/archive/2009/08/11/290696.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/290696.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/08/11/290696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/290696.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/290696.html</trackback:ping><description><![CDATA[<<span id="wmqeeuq" class="hilite1">c3p0</span>-config> <br />   <default-config> <br /> <!--当连接池中的q接耗尽的时?span class="hilite1">c3p0</span>一ơ同时获取的q接数。Default: 3 --> <br /> <property name="acquireIncrement">3</property> <br /> <br /> <!--定义在从数据库获取新q接p|后重复尝试的ơ数。Default: 30 --> <br /> <property name="acquireRetryAttempts">30</property> <br /> <br /> <!--两次q接中间隔时_(d)单位毫秒。Default: 1000 --> <br /> <property name="acquireRetryDelay">1000</property> <br /> <br /> <!--q接关闭旉认将所有未提交的操作回滚。Default: false --> <br /> <property name="autoCommitOnClose">false</property> <br /> <br /> <!--<span id="wmqeeuq" class="hilite1">c3p0</span>徏一张名为Test的空表,q用其自带的查询语句进行测试。如果定义了(jin)q个参数那么 <br />   属性preferredTestQuery被忽略。你不能在这张Test表上q行M操作Q它?yu)只?span class="hilite1">c3p0</span>试 <br />   使用。Default: null--> <br /> <property name="automaticTestTable">Test</property> <br /> <br /> <!--获取q接p|会(x)引v所有等待连接池来获取连接的U程抛出异常。但是数据源仍有?<br />   保留Qƈ在下ơ调用getConnection()的时候l尝试获取连接。如果设为trueQ那么在试 <br />   获取q接p|后该数据源将x(chng)已断开q永久关闭。Default: false--> <br /> <property name="breakAfterAcquireFailure">false</property> <br /> <br /> <!--当连接池用完时客L(fng)调用getConnection()后等待获取新q接的时_(d)时后将抛出 <br />   SQLException,如设?则无限期{待。单位毫U。Default: 0 --> <br /> <property name="checkoutTimeout">100</property> <br /> <br /> <!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全\径?<br />   Default: com.mchange.v2.<span id="wmqeeuq" class="hilite1">c3p0</span>.impl.DefaultConnectionTester--> <br /> <property name="connectionTesterClassName"></property> <br /> <br /> <!--指定<span id="wmqeeuq" class="hilite1">c3p0</span> libraries的\径,如果Q通常都是q样Q在本地卛_获得那么无需讄Q默认null卛_ <br />   Default: null--> <br /> <property name="factoryClassLocation">null</property> <br /> <br /> <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. <br />   Q文档原文)(j)作者强烈徏议不使用的一个属?-> <br /> <property name="forceIgnoreUnresolvedTransactions">false</property> <br /> <br /> <!--?0U检查所有连接池中的I闲q接。Default: 0 --> <br /> <property name="idleConnectionTestPeriod">60</property> <br /> <br /> <!--初始化时获取三个q接Q取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <br /> <property name="initialPoolSize">3</property> <br /> <br /> <!--最大空闲时?60U内未用则q接被丢弃。若?则永不丢弃。Default: 0 --> <br /> <property name="maxIdleTime">60</property> <br /> <br /> <!--q接池中保留的最大连接数。Default: 15 --> <br /> <property name="maxPoolSize">15</property> <br /> <br /> <!--JDBC的标准参敎ͼ用以控制数据源内加蝲的PreparedStatements数量。但׃预缓存的statements <br />   属于单个connection而不是整个连接池。所以设|这个参数需要考虑到多斚w的因素?<br />   如果maxStatements与maxStatementsPerConnection均ؓ(f)0Q则~存被关闭。Default: 0--> <br /> <property name="maxStatements">100</property> <br /> <br /> <!--maxStatementsPerConnection定义?jin)连接池内单个连接所拥有的最大缓存statements数。Default: 0  --> <br /> <property name="maxStatementsPerConnection"></property> <br /> <br /> <!--<span id="wmqeeuq" class="hilite1">c3p0</span>是异步操作的Q缓慢的JDBC操作通过帮助q程完成。扩展这些操作可以有效的提升性能 <br />   通过多线E实现多个操作同时被执行。Default: 3--> <br /> <property name="numHelperThreads">3</property> <br /> <br /> <!--当用戯用getConnection()时root用户成ؓ(f)去获取连接的用户。主要用于连接池q接?span class="hilite1">c3p0</span> <br />   的数据源时。Default: null--> <br /> <property name="overrideDefaultUser">root</property> <br /> <br /> <!--与overrideDefaultUser参数对应使用的一个参数。Default: null--> <br /> <property name="overrideDefaultPassword">password</property> <br /> <br /> <!--密码。Default: null--> <br /> <property name="password"></property> <br /> <br /> <!--定义所有连接测试都执行的测试语句。在使用q接试的情况下q个一显著提高?gu)试速度。注意:(x) <br />   试的表必须在初始数据源的时候就存在。Default: null--> <br /> <property name="preferredTestQuery">select id from test where id=1</property> <br /> <br /> <!--用户修改pȝ配置参数执行前最多等?00U。Default: 300 --> <br /> <property name="propertyCycle">300</property> <br /> <br /> <!--因性能消耗大请只在需要的时候用它。如果设为true那么在每个connection提交?<br />   时候都校验其有效性。徏议用idleConnectionTestPeriod或automaticTestTable <br />   {方法来提升q接试的性能。Default: false --> <br /> <property name="testConnectionOnCheckout">false</property> <br /> <br /> <!--如果设ؓ(f)true那么在取得连接的同时校验连接的有效性。Default: false --> <br /> <property name="testConnectionOnCheckin">true</property> <br /> <br /> <!--用户名。Default: null--> <br /> <property name="user">root</property> <br /> <br /> <!--早期?span class="hilite1">c3p0</span>版本对JDBC接口采用动态反代理。在早期版本用途广泛的情况下这个参?<br />   允许用户恢复到动态反代理以解决不稳定的故障。最新的非反代理更快ƈ且已l开?<br />   q泛的被使用Q所以这个参数未必有用。现在原先的动态反与新的非反代理同时受?<br />   支持Q但今后可能的版本可能不支持动态反代理。Default: false--> <br /> <property name="usesTraditionalReflectiveProxies">false</property> <br /> <br />     <property name="automaticTestTable">con_test</property> <br />     <property name="checkoutTimeout">30000</property> <br />     <property name="idleConnectionTestPeriod">30</property> <br />     <property name="initialPoolSize">10</property> <br />     <property name="maxIdleTime">30</property> <br />     <property name="maxPoolSize">25</property> <br />     <property name="minPoolSize">10</property> <br />     <property name="maxStatements">0</property> <br />     <user-overrides user="swaldman"> <br />     </user-overrides> <br />   </default-config> <br />   <named-config name="dumbTestConfig"> <br />     <property name="maxStatements">200</property> <br />     <user-overrides user="poop"> <br />       <property name="maxStatements">300</property> <br />     </user-overrides> <br />    </named-config> <br /> </<span id="wmqeeuq" class="hilite1">c3p0</span>-config> <br /> <img src ="http://www.aygfsteel.com/titanaly/aggbug/290696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-08-11 17:47 <a href="http://www.aygfsteel.com/titanaly/archive/2009/08/11/290696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Communications link failure due to underlying exceptionhttp://www.aygfsteel.com/titanaly/archive/2009/08/11/290691.html不高?/dc:creator>不高?/author>Tue, 11 Aug 2009 09:27:00 GMThttp://www.aygfsteel.com/titanaly/archive/2009/08/11/290691.htmlhttp://www.aygfsteel.com/titanaly/comments/290691.htmlhttp://www.aygfsteel.com/titanaly/archive/2009/08/11/290691.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/290691.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/290691.html

最q的一个项目在Hibernate使用C3P0的连接池Q数据库为Mysql。开发测试没有问题,在运行中每个一D长的空闲时间就出现异常:


  1. org.hibernate.exception.JDBCConnectionException: could not execute query
  2. at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
  3. at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
  4. .......
  5. Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
  6. ** BEGIN NESTED EXCEPTION **
  7. com.mysql.jdbc.CommunicationsException
  8. MESSAGE: Communications link failure due to underlying exception:
  9. ** BEGIN NESTED EXCEPTION **
  10. java.net.SocketException
  11. MESSAGE: Broken pipe
  12. STACKTRACE:
  13. java.net.SocketException: Broken pipe
  14. at java.net.SocketOutputStream.socketWrite0(Native Method)
  15. ......
  16. ** END NESTED EXCEPTION **

查看?jin)Mysql的文档,以及(qing)Connector/J的文档以?qing)在U说明发玎ͼ出现q种异常的原因是Q?/p>

Mysql服务器默认的“wait_timeout”?时Q也是说一个connectionI闲过8个小ӞMysql自动断开该connection。这是问题的所在,在C3P0 pools中的connections如果I闲过8时QMysql其断开Q而C3P0q不知道该connection已经失效Q如果这时有ClienthconnectionQC3P0该失效的Connection提供lC(j)lientQ将?x)造成上面的异常?/p>

解决的方法有3U:(x)

  1. 增加wait_timeout的时间?
  2. 减少Connection pools中connection的lifetime?
  3. 试Connection pools中connection的有效性?

当然最好的办法是同时综合用上q?U方法,下面DBCP和C3P0分别做一说明Q假设wait_timeout为默认的8时

DBCP增加以下配置信息:

  • //set to 'SELECT 1'
  • validationQuery = "SELECT 1"
  • //set to 'true'
  • testWhileIdle = "true"
  • //some positive integer
  • timeBetweenEvictionRunsMillis = 3600000
  • //set to something smaller than 'wait_timeout'
  • minEvictableIdleTimeMillis = 18000000
  • //if you don't mind a hit for every getConnection(), set to "true"
  • testOnBorrow = "true"




    C3P0增加以下配置信息:
     

  • //获取connnection时测试是否有?/span>
  • testConnectionOnCheckin = true
  • //自动试的table名称
  • automaticTestTable=C3P0TestTable
  • //set to something much less than wait_timeout, prevents connections from going stale
  • idleConnectionTestPeriod = 18000
  • //set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
  • maxIdleTime = 25000
  • //if you can take the performance 'hit', set to "true"
  • testConnectionOnCheckout = true
  •  

     

     

    在配|文件中要写?nbsp; <property name="minPoolSize"><value>1</value></property> 格式

    不能写成 q样<property name="properties">
       <props>
        <prop key="c3p0.initialPoolSize">1</prop>

       </props>

    </property>

    c3p0不能完全识别!!



    ]]>
    վ֩ģ壺 ũ| ɽ| | Ǭ| | | | | | ų| | | | Ӧ| ɽ| ʯ| | | â| | | ֯| | ȫ| | ˮ| | | | | ӱ| ɽ| ˮ| | | Ϫ| ½| Ӷ| | | Թ|