﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-tinguo002-随笔分类-tomcat</title><link>http://www.blogjava.net/tinguo002/category/52101.html</link><description>&lt;script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"&gt;&lt;/script&gt;
&lt;!-- iteye 460 60 --&gt;
&lt;ins class="adsbygoogle"
     style="display:inline-block;width:468px;height:60px"
     data-ad-client="ca-pub-2876867208357149"
     data-ad-slot="0418982663"&gt;&lt;/ins&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
</description><language>zh-cn</language><lastBuildDate>Wed, 12 Nov 2014 23:41:35 GMT</lastBuildDate><pubDate>Wed, 12 Nov 2014 23:41:35 GMT</pubDate><ttl>60</ttl><item><title>java.net.SocketException: Connection reset 解决方法</title><link>http://www.blogjava.net/tinguo002/archive/2014/06/27/415170.html</link><dc:creator>一堣而安</dc:creator><author>一堣而安</author><pubDate>Fri, 27 Jun 2014 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/tinguo002/archive/2014/06/27/415170.html</guid><wfw:comment>http://www.blogjava.net/tinguo002/comments/415170.html</wfw:comment><comments>http://www.blogjava.net/tinguo002/archive/2014/06/27/415170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinguo002/comments/commentRss/415170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinguo002/services/trackbacks/415170.html</trackback:ping><description><![CDATA[推荐好文：<a href="http://www.cnblogs.com/zmc/p/3295761.html">http://www.cnblogs.com/zmc/p/3295761.html</a><br /><br />
<p>当数据库连接池中的连接被创建而长时间不使用的情况下，该连接会自动回收并失效，但客户端并不知道，在进行数据库操作时仍然使用的是无效的数据库连接，这样，就导致客户端程序报&#8220; java.sql.SQLException: Io 异常: Connection reset&#8221; 或&#8220;java.sql.SQLException 关闭的连接&#8221;异常。</p>
<p><br />解决办法：客户端在使用一个无效的连接时会先对该连接进行测试，如果发现该连接已经无效，则重新从连接池获取有效数据库连接来使用。<br /></p>
<p>在tomcat的<span style="color: red">context.xml</span>里面设置数据源时候可参考：</p>
<p>&nbsp;&lt;Resource auth="Container"<br />&nbsp;&nbsp;driverClassName="oracle.jdbc.OracleDriver"<br />&nbsp;&nbsp;type="javax.sql.DataSource" <br />&nbsp;&nbsp;url="jdbc:oracle:thin:@11.11.11.45:1521:orcl"<br />&nbsp;&nbsp;name="jdbc/login"<br />&nbsp;&nbsp;username="login"<br />&nbsp;&nbsp;password="login"<br />&nbsp;&nbsp;maxActive="15"<br />&nbsp;&nbsp;maxIdle="10"<br />&nbsp;&nbsp;maxWait="-1"<br />&nbsp;&nbsp;minIdle="2"<br />&nbsp;&nbsp;removeAbandonedTimeout="5"<br />&nbsp;&nbsp;<span style="color: red">testOnBorrow="true"</span><br /><span style="color: red">&nbsp;&nbsp;testWhileIdle="true"</span><br /><span style="color: red">&nbsp;&nbsp;testOnReturn="true"</span><br /><span style="color: red">&nbsp;&nbsp;removeAbandoned="true"</span><br /><span style="color: red">&nbsp;&nbsp;logAbandoned="true"</span><br /><span style="color: red">&nbsp;&nbsp;validationQuery="select 1 from dual"</span><br />&nbsp;/&gt;&nbsp;<br />&nbsp;<br />&nbsp;<br />参考：<a href="http://www.cnblogs.com/younes/archive/2012/06/01/2529483.html">http://www.cnblogs.com/younes/archive/2012/06/01/2529483.html</a><br /><br /><br /><br /><br /></p>
<h2 class="title content-title">DBCP数据库连接失效的解决方法(Io 异常：Connection reset)</h2>
<div id="content" class="content mod-cs-content text-content clearfix">
<p><br />网上很多评论说DBCP有很多BUG，但是都没有指明是什么BUG，只有一部分人说数据库如果因为某种原因断掉后再DBCP取道的连接都是失效的连接，而没有重新取。有的时候会报Io 异常：Connection reset。</p>
<p>解决方法：</p>
<p>spring中datasource的配置如下：<br />&nbsp;&nbsp;&nbsp; &lt;bean id="dispatchdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:myserver" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="username" value="user1" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="password" value="pwd" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="maxActive" value="10000" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="maxIdle" value="30" /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="minIdle" value="2" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="maxWait" value="600000" /&gt; <br /><span style="color: red">&nbsp;&nbsp;&nbsp; &lt;property name="testOnBorrow" value="true"/&gt; </span><br /><span style="color: red">&nbsp;&nbsp;&nbsp; &lt;property name="testWhileIdle" value="true"/&gt; </span><br /><span style="color: red">&nbsp;&nbsp;&nbsp; &lt;property name="validationQuery" value="select 1 from dual"/&gt; </span><br />&lt;/bean&gt; </p>
<p>&nbsp;</p>
<p>分析:</p>
<p>DBCP使用apache的对象池ObjectPool作为连接池的实现，有以下主要的方法</p>
<p>Object borrowObject() throws Exception;从对象池取得一个有效对象</p>
<p>void returnObject(Object obj) throws Exception;使用完的对象放回对象池</p>
<p>void invalidateObject(Object obj) throws Exception;使对象失效</p>
<p>void addObject() throws Exception;生成一个新对象</p>
<p><br />ObjectPool的一个实现就是GenericObjectPool，这个类使用对象工厂PoolableObjectFactory实现对象的生成，失效检查等等功能，以其实现数据库连接工厂PoolableConnectionFactory做以说明，主要方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Object makeObject() throws Exception; 使用ConnectionFactory生成新连接</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; void destroyObject(Object obj) throws Exception;关闭连接</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; boolean validateObject(Object obj); 验证连接是否有效，如果_validationQuery不空，则使用该属性作为验证连接是否有效的sql语句，查询数据库</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; void activateObject(Object obj) throws Exception;激活连接对象</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; void passivateObject(Object obj) throws Exception; 关闭连接生成过的Statement和ResultSet，使连接处于非活动状态</p>
<p>&nbsp;&nbsp;&nbsp; 而GenericObjectPool有几个主要属性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; _timeBetweenEvictionRunsMillis：失效检查线程运行时间间隔，默认-1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; _maxIdle：对象池中对象最大个数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; _minIdle：对象池中对象最小个数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; _maxActive：可以从对象池中取出的对象最大个数，为0则表示没有限制，默认为8</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在构造GenericObjectPool时，会生成一个内嵌类Evictor，实现自Runnable接口。如果 _timeBetweenEvictionRunsMillis大于0，每过_timeBetweenEvictionRunsMillis毫秒 Evictor会调用evict()方法，检查对象的闲置时间是否大于 _minEvictableIdleTimeMillis毫秒（_minEvictableIdleTimeMillis小于等于0时则忽略，默认为30 分钟），是则销毁此对象，否则就激活并校验对象，然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。在调用 returnObject方法把对象放回对象池，首先检查该对象是否有效，然后调用PoolableObjectFactory 的passivateObject方法使对象处于非活动状态。再检查对象池中对象个数是否小于_maxIdle，是则可以把此对象放回对象池，否则销毁此对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 还有几个很重要的属性<span style="color: red">，_testOnBorrow、_testOnReturn、_testWhileIdle</span>，这些属性的意义是<span style="color: red">取得、返回对象和空闲时是否进行验证</span>，检查对象是否有效，<span style="color: red">默认都为false即不验证</span>。所以当使用DBCP时，数据库连接因为某种原因断掉后，再从连接池中取得连接又不进行验证，这时取得的连接实际已经时无效的数据库连接了。网上很多说 DBCP的bug应该都是如此吧，只有把这些属性设为true，再提供_validationQuery语句就可以保证数据库连接始终有效了，oracle数据库可以使用SELECT COUNT(*) FROM DUAL，不过DBCP要求_validationQuery语句查询的记录集必须不为空，可能这也可以算一个小小的BUG，其实只要_validationQuery语句执行通过就可以了。</p></div>
<p>参考：<a href="http://hi.baidu.com/dobodo/item/7d95e3384d181cc4392ffab5">http://hi.baidu.com/dobodo/item/7d95e3384d181cc4392ffab5<br /><br /><br /><br />Tomcat Resource可配置的属性<br /><br /></a><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/tinguo002/Tomcat-Resource可配置属性.png" /><br /><br /><br /></p><img src ="http://www.blogjava.net/tinguo002/aggbug/415170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinguo002/" target="_blank">一堣而安</a> 2014-06-27 11:43 <a href="http://www.blogjava.net/tinguo002/archive/2014/06/27/415170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat6.0 连接池的配置</title><link>http://www.blogjava.net/tinguo002/archive/2014/06/18/414887.html</link><dc:creator>一堣而安</dc:creator><author>一堣而安</author><pubDate>Wed, 18 Jun 2014 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/tinguo002/archive/2014/06/18/414887.html</guid><wfw:comment>http://www.blogjava.net/tinguo002/comments/414887.html</wfw:comment><comments>http://www.blogjava.net/tinguo002/archive/2014/06/18/414887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinguo002/comments/commentRss/414887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinguo002/services/trackbacks/414887.html</trackback:ping><description><![CDATA[&nbsp;Tomcat6.0 连接池的配置 
<p>1.本人当前使用的Tomcat版本为：6.0.20，oracle为稳定的9i版本</p>
<p>2.下文为方便起见，依习惯以%Tomcat_Home%表示Tomcat安装的目录，本人安装目录为&#8220;E:\Program Files\WindowsXP\tomcat6&#8221;</p>
<p>配置步骤如下：</p>
<p>1.Tomcat 6的配置和以前的不同了，不推荐在server.xml中进行配置，而是在%Tomcat_Home%\webapps\yourApp\META-INF \context.xml中进行配置才是更好的方法。而不是以前版本%Tomcat_Home%\conf下的context.xml文件。这样就可以在不同的web应用下单独配置连接池了，且Tomcat会自动重载。当然你也可以更改%Tomcat_Home%\conf下的context.xml文件，将所有web应用下的连接池进行统一配置。</p>
<p>2.将代码修改如下：</p>
<p>view plaincopy to clipboardprint?<br />&lt;Context reloadable="true"&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; maxActive="100"&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; maxIdle="30"&nbsp; <br />&nbsp;&nbsp;&nbsp; maxWait="10000"&nbsp; <br />&nbsp;&nbsp;&nbsp; username="scott"&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; password="tiger"&nbsp; <br />&nbsp;&nbsp;&nbsp; driverClassName="oracle.jdbc.driver.OracleDriver"&nbsp; <br />&nbsp;&nbsp;&nbsp; url="jdbc:oracle:thin:@localhost:1521:ora9"/&gt;&nbsp; <br />&lt;/Context&gt;&nbsp; <br />&lt;Context reloadable="true"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;<br />&nbsp;&lt;Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource" <br />&nbsp;maxActive="100" <br />&nbsp;maxIdle="30"<br />&nbsp;maxWait="10000"<br />&nbsp;username="scott" <br />&nbsp;password="tiger"<br />&nbsp;driverClassName="oracle.jdbc.driver.OracleDriver"<br />&nbsp;url="jdbc:oracle:thin:@localhost:1521:ora9"/&gt;<br />&lt;/Context&gt;</p>
<p>name 为当前数据源JNDI的名字，可以随意设定；</p>
<p>auth 为验证方式；</p>
<p>type 资源类型；</p>
<p>driverClassName 为Oracle驱动引用；</p>
<p>maxActiv 为连接池最大激活的连接数，设为0表示无限制；</p>
<p>maxIdle 表示即使没有数据库连接时依然可以保持30个空闲的连接，而不被清除，随时处于待命状态。设为0表示无限制；</p>
<p>maxWait 为连接最大的等待时间，单位毫秒，取值10000，表示10000秒后超时。设为-1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示无限制。；</p>
<p>username 为oracle数据库的一个用户名； </p>
<p>password 为username的密码；</p>
<p>url 为连接oracle的连接地址；</p>
<p>注：本人尝试将代码&#8220;driverClassName="oracle.jdbc.driver.OracleDriver"&#8221;改为&#8220;driverClassName="oracle.jdbc.OracleDriver"&#8221;程序依然运行正常，刚开始以为老师的代码有问题</p>
<p>3.在程序中的调用形式为：</p>
<p>view plaincopy to clipboardprint?<br />Context context = new InitialContext();&nbsp;&nbsp; <br />DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");&nbsp;&nbsp; <br />Connection conn = ds.getConnection();&nbsp; <br />Context context = new InitialContext();<br />DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");<br />Connection conn = ds.getConnection(); </p>
<p>注：&#8220;java:/comp/env/jdbc/oracleds&#8221;红色标记文字为步骤1里设置的Resource name</p>
<p>则可以将建立connection的方式以上述形式取代传统方式：</p>
<p>view plaincopy to clipboardprint?<br />String driver = "oracle.jdbc.driver.OracleDriver";&nbsp;&nbsp; <br />String url = "jdbc:oracle:thin:@localhost:1521:ora9";&nbsp;&nbsp; <br />String username = "scott";&nbsp;&nbsp; <br />String password = "tiger";&nbsp;&nbsp; <br />Class.forName(driver);&nbsp;&nbsp; <br />Connection conn = DriverManager.getConnection(url, username, password);&nbsp; <br />String driver = "oracle.jdbc.driver.OracleDriver";<br />String url = "jdbc:oracle:thin:@localhost:1521:ora9";<br />String username = "scott";<br />String password = "tiger";<br />Class.forName(driver);<br />Connection conn = DriverManager.getConnection(url, username, password); </p>
<p>4.另外还需将用到的jdbc驱动类库导入到%Tomcat_Home%\lib目录下</p>
<p>否则会抛出如下异常：<br />org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'</p>
<p>依上述步骤就能成功的配置Tomcat6.0 连接池，还有网友贴文说需</p>
<p>在web.xml文件中的web-app节点下加入如下代码形式：<br />&lt;resource-ref&gt;<br />&lt;res-ref-name&gt;jdbc/myoracle&lt;/res-ref-name&gt;<br />&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />&lt;/resource-ref&gt;</p>
<p>因本人未添加此项，程序依然正确，故本人认为此步骤为非必要项<br /><br /></p>
<p>&nbsp;---------------------------------------------------------------------------<br /></p>
<p>今天需要在另一台机器上重新部署系统，重新设置db的连接池。当我把tomcat拷贝到那台机器，并且修改META-INF\context.xml，然后重新启动tomcat，但发现系统连接的仍然是老的db。再次检查了META-INF\context.xml文件，确信了这个文件已经正确设置db连接了，这也说明这个文件并没有真正起作用。查看了tomcat下conf\context.xml也没有设置db的连接池。那是哪个文件在起作用呢？折腾了办法，后来发现tomcat在conf\Catalina\localhost下生成了一个和原来META-INF\context.xml相同内容的文件，怀疑一定是这个文件在起作用？删除conf\Catalina\localhost目录，重启tomcat，问题消失。</p>
<p>转载一篇<a href="http://cailin.javaeye.com/blog/151507"><font color="#366900">tomcat加载类的顺序</font></a>：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>bin：存放启动和关闭tomcat的脚本文件；&nbsp;</p>
<p>/conf：存放tomcat的各种配置文件，比如：server.xml&nbsp;</p>
<p>/server/lib：存放tomcat服务器所需要的各种jar文件（jar文件只可被tomcat 服务器访问）&nbsp;</p>
<p>/server/webapps：存放tomcat自带的两个web应用：admin应用和manager应用。&nbsp;</p>
<p>/common/lib：存放tomcat服务器以及所有web应用都可以访问的jar文件夹（web和tomcat服务器都可访问此jar）&nbsp;</p>
<p>/shared/lib：存放web都可访问的jar文件。（可以被所有的web访问，但不能被tomcat访问）&nbsp;</p>
<p>/logs：存放tomcat的日志文件&nbsp;</p>
<p>/webapps：当发布web应用时，默认情况下把web应用文件放于此目录下&nbsp;</p>
<p>/work：tomcat把由jsp生成的Servlet放于此目录&nbsp;</p>
<p>另：在web应用中，WEB-Inf目录下，也可以建立lib子目录，在此子目录下可以存放各种jar文件，这些jar文件只能被当前web应用访问。其中，在web-inf目录下的lib与classes目录，Tomcat类装载器先装载classes目录下的类，再装载lib目录下的类。因为类同名时，classes优先。&nbsp;</p>
<p>&nbsp;</p>
<p>其中jsp运行时，查找class的顺序为：项目文件夹（WEB-INF\lib）===》容器文件夹（tomcat\common\lib）==》jdk文件夹（jdk\jre\lib\ext）&nbsp;</p>
<p>&nbsp;</p>
<p>Tomcat的class加载的优先顺序一览&nbsp;</p>
<p>1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。&nbsp;</p>
<p>2.环境变量CLASSPATH中的jar和class文件。&nbsp;</p>
<p>3.$CATALINA_HOME/common/classes下的class文件。&nbsp;</p>
<p>4.$CATALINA_HOME/commons/endorsed下的jar文件。&nbsp;</p>
<p>5.$CATALINA_HOME/commons/i18n下的jar文件。&nbsp;</p>
<p>6.$CATALINA_HOME/common/lib 下的jar文件。&nbsp;</p>
<p>（JDBC驱动之类的jar文件可以放在这里，这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。）&nbsp;</p>
<p>7.$CATALINA_HOME/server/classes下的class文件。&nbsp;</p>
<p>8.$CATALINA_HOME/server/lib/下的jar文件。&nbsp;</p>
<p>9.$CATALINA_BASE/shared/classes 下的class文件。&nbsp;</p>
<p>10.$CATALINA_BASE/shared/lib下的jar文件。&nbsp;</p>
<p>11.各自具体的webapp /WEB-INF/classes下的class文件。&nbsp;</p>
<p>12.各自具体的webapp /WEB-INF/lib下的jar文件。&nbsp;</p>
<p>&nbsp;</p>
<p>class的搜寻顺序如下&nbsp;</p>
<p>-------------&nbsp;</p>
<p>/WEB-INF/classes of your web application&nbsp;</p>
<p>/WEB-INF/lib/*.jar of your web application&nbsp;</p>
<p>$CATALINA_HOME/common/classes&nbsp;</p>
<p>$CATALINA_HOME/common/endorsed/*.jar&nbsp;</p>
<p>$CATALINA_HOME/common/i18n/*.jar&nbsp;</p>
<p>$CATALINA_HOME/common/lib/*.jar&nbsp;</p>
<p>$CATALINA_BASE/shared/classes&nbsp;</p>
<p>$CATALINA_BASE/shared/lib/*.jar&nbsp;</p>
<p>--------------&nbsp;</p>
<p>因此放在不同webapp里的class文件，会被classloader加载成不同的实例。&nbsp;</p>
<p>例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下。&nbsp;</p>
<p>package com.lizongbo;&nbsp;</p>
<p>public class TestClass {&nbsp;</p>
<p>&nbsp;&nbsp;private String NAME="lizongbo";&nbsp;</p>
<p>}&nbsp;</p>
<p>&nbsp;</p>
<p>package com.lizongbo;&nbsp;</p>
<p>public class TestClass {&nbsp;</p>
<p>&nbsp;&nbsp;private String NAME="li_zongbo";&nbsp;</p>
<p>}&nbsp;</p>
<p>&nbsp;</p>
<p>在不同的webapp得到的com.lizongbo.NAME结果是不同的，且互不影响。&nbsp;</p>
<p>但是注意，以下包名开头的class例外：&nbsp;</p>
<p>javax.*&nbsp;</p>
<p>org.xml.sax.*&nbsp;</p>
<p>org.w3c.dom.*&nbsp;</p>
<p>org.apache.xerces.*&nbsp;</p>
<p>org.apache.xalan.*&nbsp;</p>
<p>&nbsp;</p>
<p>ps,注意.在各个jar中的\META-INF\MAINFEST.MF文件里Class-Path键值对，也会提供jar的加载优先顺序。&nbsp;</p>
<p>例如某jar的MAINFEST.MF内容如下：&nbsp;</p>
<p>Manifest-Version: 1.0&nbsp;</p>
<p>Created-By: lizongbo&nbsp;</p>
<p>Class-Path: commons-beanutils.jar&nbsp;</p>
<p>Class-Path: commons-collections.jar&nbsp;</p>
<p>Class-Path: commons-dbcp.jar&nbsp;</p>
<p>Class-Path: commons-digester.jar&nbsp;</p>
<p>Class-Path: commons-logging.jar&nbsp;</p>
<p>Class-Path: commons-pool.jar&nbsp;</p>
<p>Class-Path: commons-services.jar&nbsp;</p>
<p>Class-Path: commons-validator.jar&nbsp;</p>
<p>Class-Path: jakarta-oro.jar&nbsp;</p>
<p>Main-Class: com.lizongbo.MyTestClass&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>那么在加载这个jar的时候，会先在此jar所在目录下依次先加载commons-beanutils.jar，commons-collections.jar。。。等jar文件。&nbsp;</p>
<p>&nbsp;</p>
<p>在不同的地方放置jar和class可能会产生意想不到的后果,，尤其是不同版本的jar文件，因此在实际应用部署web应用时候要特别留心.&nbsp;</p>
<p>&nbsp;</p>
<p>例如 使用javamail常见的一个出错信息:&nbsp;</p>
<p>javax.mail.NoSuchProviderException: No provider for smtp&nbsp;</p>
<p>其真实原因就很可能如下:&nbsp;</p>
<p>在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar&nbsp;</p>
<p>在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在&nbsp;</p>
<p>D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,&nbsp;</p>
<p>那么lizongbo这个webapp中使用到javamail进行邮件发送的时候，便会出现No provider for smtp的错误。</p><br /><br />详细出处参考：<a href="http://www.blogjava.net/gm_jing/articles/308828.html">http://www.blogjava.net/gm_jing/articles/308828.html</a> <img src ="http://www.blogjava.net/tinguo002/aggbug/414887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinguo002/" target="_blank">一堣而安</a> 2014-06-18 14:54 <a href="http://www.blogjava.net/tinguo002/archive/2014/06/18/414887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Invalid byte 2 of 2-byte UTF-8 sequence解决方案</title><link>http://www.blogjava.net/tinguo002/archive/2013/03/17/396566.html</link><dc:creator>一堣而安</dc:creator><author>一堣而安</author><pubDate>Sun, 17 Mar 2013 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/tinguo002/archive/2013/03/17/396566.html</guid><wfw:comment>http://www.blogjava.net/tinguo002/comments/396566.html</wfw:comment><comments>http://www.blogjava.net/tinguo002/archive/2013/03/17/396566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinguo002/comments/commentRss/396566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinguo002/services/trackbacks/396566.html</trackback:ping><description><![CDATA[转载：<a href="http://www.cnblogs.com/balaamwe/archive/2012/03/07/2383413.html">http://www.cnblogs.com/balaamwe/archive/2012/03/07/2383413.html</a><a id="cb_post_title_url" href="http://www.cnblogs.com/balaamwe/archive/2012/03/07/2383413.html"><br /><br />Invalid byte 2 of 2-byte UTF-8 sequence解决方案</a><div class="postText"><div id="cnblogs_post_body"><p>异常信息如下：</p><p>2009-9-14 3:56:54 org.apache.catalina.startup.Catalina stopServer&nbsp;&nbsp; <br />严重: Catalina.stop:&nbsp;&nbsp;&nbsp; <br />com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence.&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanAttribute(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1644)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:410)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at java.lang.reflect.Method.invoke(Unknown Source)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:337)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:415) </p><p> </p><p> </p><p> </p><p>解决方案如下：</p><p> </p><p>方案1</p><p>检查tomcat里面的配置文件中有没有使用汉字（包括注释），有汉字则把汉字改成英文</p><p> </p><p>方案2</p><p>在有汉字的配置文件中，加入如下代码</p><p>&lt;?xml version="1.0" encoding="gbk"?&gt;</p></div></div><img src ="http://www.blogjava.net/tinguo002/aggbug/396566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinguo002/" target="_blank">一堣而安</a> 2013-03-17 21:37 <a href="http://www.blogjava.net/tinguo002/archive/2013/03/17/396566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>loadrunner 9.5 9.0 8.1下载地址 和license</title><link>http://www.blogjava.net/tinguo002/archive/2012/12/08/392673.html</link><dc:creator>一堣而安</dc:creator><author>一堣而安</author><pubDate>Sat, 08 Dec 2012 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/tinguo002/archive/2012/12/08/392673.html</guid><wfw:comment>http://www.blogjava.net/tinguo002/comments/392673.html</wfw:comment><comments>http://www.blogjava.net/tinguo002/archive/2012/12/08/392673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinguo002/comments/commentRss/392673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinguo002/services/trackbacks/392673.html</trackback:ping><description><![CDATA[转载自：<a href="http://willvvv.iteye.com/blog/1198158">http://willvvv.iteye.com/blog/1198158<br /><br /></a>
<ul class="blog_categories"><strong>博客分类：</strong><li><a href="http://willvvv.iteye.com/category/48602">随手记</a></li></ul>
<div class="news_tag"></div>
<div id="blog_content" class="blog_content">
<p><span><img alt="" src="http://willvvv.iteye.com/images/smiles/icon_mad.gif" />最近做压力测试，需要下载下loadrunner，杯具的是从hp官网下载的loadrunner11，解压时报压缩包错误，没办法只有找第三方的下载，51test因为版权问题已经不提供下载，几个提供软件下载网站只有多特www.duote.com提供了8.0版本的下载(http://www.duote.com/soft/11496.html)，而类似于http://www.genilogix.com/downloads/loadrunner/loadrunner-11.iso 这个的已经无效。</span></p>
<p><span><br /></span></p>
<p><span>找了一下午终于找到一个版本稍微高一点的9.5的下载地址：</span></p>
<p><span>1.ftp地址<a href="ftp://www.atstudy.com/" target="_blank">ftp://www.atstudy.com</a><br />2.用户名和密码：<span style="color: rgb(0,0,0)">user1 user1</span></span></p>
<p><span></span></p>
<p><span>3.<span style="color: rgb(0,0,0)">建议使用ftp<span class="t_tag">客户端</span><span class="t_tag">软件</span>，如cuteftp，leapftp，flashfxp等连接，因为用ie可能连不上</span></span></p>
<p><span style="color: rgb(0,0,0)">4.在mercury目录下下载</span></p>
<p>&nbsp;</p>
<p>因为使用firefox，装了一个fireftp插件，就可以下载了！</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>global 100：AEAMAUIK-YAFEKEKJJKEEA-BCJGI</p>
<p>golba-1000：AEACFSJI-YASEKJJKEAHJD-BCLBR</p>
<p>10000 web ：AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB</p>
<p>&nbsp;</p>
<p>注意：loadrunner的License管理器，只支持一个License，如果先后输入了上面的两个License，最后实际生效的只有最后一个。</p>
<p><img alt="" /></p>
<p><span><br /></span></p>
<p><span>from：http://www.cnblogs.com/jiaxiaoai/archive/2011/06/12/2078749.html</span><span style="color: rgb(0,0,0)"><br /></span></p></div><img src ="http://www.blogjava.net/tinguo002/aggbug/392673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinguo002/" target="_blank">一堣而安</a> 2012-12-08 23:00 <a href="http://www.blogjava.net/tinguo002/archive/2012/12/08/392673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>