??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美另类极品videosbest最新版本,亚洲色图欧洲色图,麻豆免费在线http://www.aygfsteel.com/super/zh-cnSat, 17 May 2025 13:56:16 GMTSat, 17 May 2025 13:56:16 GMT60使用 apache common dbcp +common pool+mysqlq接无效的问?/title><link>http://www.aygfsteel.com/super/archive/2010/09/15/332102.html</link><dc:creator>王卫?/dc:creator><author>王卫?/author><pubDate>Wed, 15 Sep 2010 09:57:00 GMT</pubDate><guid>http://www.aygfsteel.com/super/archive/2010/09/15/332102.html</guid><wfw:comment>http://www.aygfsteel.com/super/comments/332102.html</wfw:comment><comments>http://www.aygfsteel.com/super/archive/2010/09/15/332102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/super/comments/commentRss/332102.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/super/services/trackbacks/332102.html</trackback:ping><description><![CDATA[<br /> <br /> <br /> Throwable occurred: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 50,123,505 milliseconds ago.  The last packet sent successfully to the server was 50,123,505 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.<br /> <br /> <br /> q主要是׃个原因引h?<br /> 1.mysql ?x)自动关闭长旉不用的connection,一个连接如果处于sleep状态达到mysql的参数wait_timeout指定的时?默认?时),是自动关闭q个q接<br /> 2.common pool中没有指定相应的q接(g)查参?br /> <br /> <br /> 解决办法:从common pool的配|参数来解决:<br /> <br /> <p> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><br />   <property name="driverClassName"><br />    <value>${db.driver}</value><br />   </property><br />   <property name="url"><br />    <value>${db.url}</value><br />   </property><br />   <property name="username"><br />    <value>${db.user}</value><br />   </property><br />   <property name="password"><br />    <value>${db.password}</value><br />   </property><br />   <property name="maxActive"><br />    <value>100</value><br />   </property><br />   <property name="maxIdle"><br />    <value>50</value><br />   </property><br />   <property name="maxWait"><br />    <value>10000</value><br />   </property></p> <p><br /> <span style="color: red">  <property name="timeBetweenEvictionRunsMillis"><br />    <value>3600000</value><!--1 hours--><br />   </property></span><br /> <!--<br />   <property name="minEvictableIdleTimeMillis"><br />    <value>20000</value><br />   </property><br /> --><br />   <br /> <span style="color: red">  <property name="testWhileIdle"><br />    <value>true</value><br />   </property><br />   <property name="validationQuery"><br />    <value>select 1 from dual</value><br />   </property></span><br />  </bean><br /> </p> 使用上述的三个红色的参数,可以避免这个问?q三个参数的意义:<br /> <br /> timeBetweenEvictionRunsMillis:启动connection校验定时?定时器运行时间间隔就是timeBetweenEvictionRunsMillis的?默认?1,表示不启动定时器,q里讑֮?时,只要于mysql的wait_timeout可以了(jin)<br /> <br /> testWhileIdle: true,表示(g)查idle的connection,falseZ(g)?br /> <br /> validationQuery:用于(g)查connection的sql语句.<br /> <br /> <br /> q只是一U方?另外的几U方?<br /> <br /> timeBetweenEvictionRunsMillis+minEvictableIdleTimeMillis:q种方式不检查Connection的有效?而是(g)查连接的I闲旉,大于minEvictableIdleTimeMillis清?<br /> <br />   <property name="timeBetweenEvictionRunsMillis"><br />    <value>3600000</value><!--1 hours--><br />   </property><br /> <br />   <property name="minEvictableIdleTimeMillis"><br />    <value>120000</value><!--connection的空闲时间大于这个?q接被关闭,q从q接池中删除--><br />   </property><br /> <br /> <br /> 如果不喜Ƣ用定时?也可以配|testOnBorrow+validationQuery参数:每次从连接池取参数都?x)校验连接的有效?实际上这U方式性能?x)比定时器差?<br />   <property name="testOnBorrow"><br />    <value>true</value><br />   </property><br />   <property name="validationQuery"><br />    <value>select 1 from dual</value><br />   </property><br /> <br /> <br /> 另外,也可以用testOnReturn+validationQuery,不过未必?x)解决问?q表C每ơ用完q接,归还q接池的时候检查连接的有效?q有可能D使用一ơ无效的q接,最好不要用.<br /> <br /> <br /> 上面的几U方法可以合q?只是(g)查的点多?未必是好?br /> <br /> <br /> 另外,也可以用Abandoned的那几个参数,来删除连接池中的q接.也能辑ֈ效果.我没试.<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/super/aggbug/332102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/super/" target="_blank">王卫?/a> 2010-09-15 17:57 <a href="http://www.aygfsteel.com/super/archive/2010/09/15/332102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android中点中overlay弹出带尾巴的气(chng)的实?/title><link>http://www.aygfsteel.com/super/archive/2010/08/12/android_mapview_overlay.html</link><dc:creator>王卫?/dc:creator><author>王卫?/author><pubDate>Thu, 12 Aug 2010 07:03:00 GMT</pubDate><guid>http://www.aygfsteel.com/super/archive/2010/08/12/android_mapview_overlay.html</guid><wfw:comment>http://www.aygfsteel.com/super/comments/328671.html</wfw:comment><comments>http://www.aygfsteel.com/super/archive/2010/08/12/android_mapview_overlay.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.aygfsteel.com/super/comments/commentRss/328671.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/super/services/trackbacks/328671.html</trackback:ping><description><![CDATA[<p><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/super/mappop.png" border="0" /></p> <br /> <br /> <br /> 是上面的样?br /> <br /> 做这个过E中我碰C个问?<br /> 1:如何做带ַ的气泡View<br /> 2:如何把这个Viewd到MapView?<br /> <br /> <br /> 1:如何做带ַ的气泡View<br /> 我是采用背景囄方式来实现的.当然,普通的PNG在View ~放的时候会(x)q,其是那个尖的ַ.<br /> 后来采用9.png的格?才完成了(jin)不变形的效果.9.png格式的Png可以用SDK\Tools\draw9patch.bat来处?只要把普通的png的边上标志一下就可以?具体draw9patch.bat如何使用q里׃说了(jin),|上有很多文?自己查查q道了(jin).<br /> 我生成的9.png是下面q个样子,注意四周的黑U?是9png拉时的标识<br /> <img height="51" alt="" src="http://www.aygfsteel.com/images/blogjava_net/super/bubble_background.9.png" width="65" border="0" /><br /> <br /> 有了(jin)q个png,直接攑ֈ你的工程下的res/drawable目录可以了(jin),<br /> 然后在res/layout目录下徏立你的view的xml文g,比如叫overlay_pop.xml,我的是这L(fng):<br /> <br /> <?xml version="1.0" encoding="UTF-8"?><br /> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br />  android:orientation="vertical" <br />  android:background="@drawable/bubble_background"<span style="color: red"> <!--q就是那?.png--><br /> </span> android:layout_width="wrap_content" <br />  android:layout_height="wrap_content"<br />  android:paddingLeft="5px"<br />  android:paddingTop="5px"<br />  android:paddingRight="5px"<br />  android:paddingBottom="20px"    <span style="color: red"><!--注意加上padding,否则view里面的东西就dҎ(gu)上了(jin)--><br /> </span>   ><br />     <TextView android:id="@+id/map_bubbleTitle" <br />        android:ellipsize="marquee" <br />        android:layout_width="match_parent" <br />        android:layout_height="wrap_content"<br />        android:gravity="center_horizontal"<br />        android:singleLine="true" <br />        style="@style/map_BubblePrimary" /> <span style="color: red"><!--style可以没有,我这里第一个TextView表示标题,用的是大字体--><br /> </span>    <TextView  android:id="@+id/map_bubbleText" <br />        android:layout_width="match_parent" <br />        android:layout_height="wrap_content" <br />        android:singleLine="false" <br />        style="@style/map_BubbleSecondary" /><span style="color: red"><!--style可以没有,我这里第二个TextView表示描述信息,用的是大字体--><br /> </span></LinearLayout><br /> <br /> <br /> q样popView徏立好?br /> <br /> <br /> 2:如何把这个Viewd到MapView?<br /> 通常是在mapView中点?yn)L个位|?弹出popView<br /> 或者点?yn)L个Overlay弹出popView,q里用点击Overlay来说?<br /> <br /> overlay有onTap()Ҏ(gu),你可以实现自qoverlay,overideonTap()Ҏ(gu),弹出popView,<br /> 也可以用setOnFocusChangeListener(),在listener中实现弹出popView,.<br /> 我是用的listener,因ؓ(f)setOnFocusChangeListener在失ȝ点也?x)触?我可以再失去焦点的时候隐藏popView.<br /> <br /> MapView?span style="color: red">l承自ViewGroup</span>?因此,MapView有addView()Ҏ(gu),同时q有<span style="color: red">MapView.LayoutParams<br /> </span><span style="color: red"><span style="color: #000000">MapView.LayoutParams 可以Ҏ(gu)GeoPoint来定?我就是利用这个特性来定位弹出的popView?<br /> </span><br /> <span style="color: #000000">PointItemizedOverlay overlay = new PointItemizedOverlay(drawable); <!--q是我承自ItemizedOverlay的overlay,主要是M个图?写一个名U?很简?q里不脓(chung)具体代码?-></span><br /> </span><br /> public class BaseMapActivity extends MapActivity {<br /> <br />  /**<br />   * 地图View<br />   */<br />  protected MapView mapView;<br /> <p> /**<br />   * 弹出的气泡View<br />   */<br />  private View popView;<br /> /**<br />     监听?br /> */<br />  private final ItemizedOverlay.OnFocusChangeListener onFocusChangeListener = new ItemizedOverlay.OnFocusChangeListener() {</p> <p>  @Override<br />   public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus) {<br />       //创徏气(chng)H口<br />  </p> <p>   if (popView != null) {<br />       popView.setVisibility(View.GONE);<br />    }</p> <p>   if (newFocus != null) {</p> <p>    MapView.LayoutParams geoLP = (MapView.LayoutParams) popView.getLayoutParams();<br />     <span style="color: #ff0000">geoLP.point = newFocus.getPoint();//q行用于popView的定?br /> </span>    TextView title = (TextView) popView.findViewById(R.id.map_bubbleTitle);<br />     title.setText(newFocus.getTitle());</p> <p>    TextView desc = (TextView) popView.findViewById(R.id.map_bubbleText);<br />     if (newFocus.getSnippet() == null || newFocus.getSnippet().length() == 0) {<br />      desc.setVisibility(View.GONE);<br />     } else {<br />      desc.setVisibility(View.VISIBLE);<br />      desc.setText(newFocus.getSnippet());<br />     }<br />     mapView.updateViewLayout(popView, geoLP);<br />     popView.setVisibility(View.VISIBLE);<br />    }<br />   }<br />  };<br /> </p> <br /> <br /> <br />      public void onCreate(Bundle savedInstanceState) {<br />           super.onCreate(savedInstanceState);<br />             /**<br />             省略其他代码<br />            **/<br /> <br />           //初始化气?q设|ؓ(f)不可?br /> <br />        popView = inflater.inflate(R.layout.overlay_popup, null);<br />        mapView.addView( popView,<br />              <span style="color: #ff0000">new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT,<br />            null, MapView.LayoutParams.BOTTOM_CENTER));<br />           //׃我的气(chng)的尾巴是在下边居中的,因此要设|成MapView.LayoutParams.BOTTOM_CENTER.<br />           //q里没有lGeoPoint,在onFocusChangeListener中设|?br /> </span>       views.add(popView);<br />       popView.setVisibility(View.GONE);<br /> <br />     doverlay<br />     PointItemizedOverlay overlay = new PointItemizedOverlay(drawable);<br />     //讄昄/隐藏泡(chng)的监听器<br />     overlay.setOnFocusChangeListener(onFocusChangeListener);<br />     overlay.addOverlay(/*你自qoverlayItem*/);<br />     overlay.addOverlay(/*你自qoverlayItem*/);<br />     overlay.addOverlay(/*你自qoverlayItem*/);<br /> <br />     }<br /> }<br /> <br /> q样基本完工了(jin).<br /> <br /> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/super/aggbug/328671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/super/" target="_blank">王卫?/a> 2010-08-12 15:03 <a href="http://www.aygfsteel.com/super/archive/2010/08/12/android_mapview_overlay.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android mapView中画轨迹的overlayhttp://www.aygfsteel.com/super/archive/2010/08/12/android-map.html王卫?/dc:creator>王卫?/author>Thu, 12 Aug 2010 06:21:00 GMThttp://www.aygfsteel.com/super/archive/2010/08/12/android-map.htmlhttp://www.aygfsteel.com/super/comments/328661.htmlhttp://www.aygfsteel.com/super/archive/2010/08/12/android-map.html#Feedback0http://www.aygfsteel.com/super/comments/commentRss/328661.htmlhttp://www.aygfsteel.com/super/services/trackbacks/328661.html
使用Ҏ(gu):
LineItemizedOverlay overlay = new LineItemizedOverlay();

overlay.addOverlay(/*L(fng)的OverlayItem*/);
overlay.addOverlay(/*l点的OverlayItem*/);
overlay.addLinePoint(/*要画的轨q的GeoPoint的List*/);

mapView.getOverlays().add(overlay);

/**
 *
 */
package com.xtyon.tuola.truck.map;

import java.util.ArrayList;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;

/**
 * 地图上的U型囑ֱ:包括一个v?一个终?以及(qing)之间的曲U?br />  * @author superwang
 */
public class LineItemizedOverlay extends ItemizedOverlay<OverlayItem> {
 private static final int LAYER_FLAGS = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
   | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG;
 /**
  * 用于保存L(fng)/l点数据
  */
 private final ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

 /**
  * 用于保存构成曲线的点的数?br />   */
 private final ArrayList<GeoPoint> linePoints = new ArrayList<GeoPoint>();

 /**
  * @param defaultMarker
  */
 public LineItemizedOverlay() {
  super(null);

  // TODO Auto-generated constructor stub
 }

 /* (non-Javadoc)
  * @see com.google.android.maps.ItemizedOverlay#createItem(int)
  */
 @Override
 protected OverlayItem createItem(int i) {
  return mOverlays.get(i);

 }

 /* (non-Javadoc)
  * @see com.google.android.maps.ItemizedOverlay#size()
  */
 @Override
 public int size() {
  // TODO Auto-generated method stub
  return mOverlays.size();
 }

 /**
  * 调h(hun)L(fng)/l点
  * description:
  * @param overlay
  */
 public void addOverlay(OverlayItem overlay) {
  mOverlays.add(overlay);
  populate();
 }

 /**
  * d曲线中的?br />   * description:
  * @param point
  */
 public void addLinePoint(GeoPoint point) {
  linePoints.add(point);
 }

 public ArrayList<GeoPoint> getLinePoints() {
  return linePoints;
 }

 /**
  * 画v?l点/轨迹
  */
 @Override
 public void draw(Canvas canvas, MapView mapView, boolean shadow) {
  if (!shadow) {
   //System.out.println("!!!!!!!!!!!!!!");

   canvas.save(LAYER_FLAGS);
   //canvas.save();

   Projection projection = mapView.getProjection();
   int size = mOverlays.size();
   Point point = new Point();
   Paint paint = new Paint();
   paint.setAntiAlias(true);
   OverlayItem overLayItem;

   //画v?l点
   for (int i = 0; i < size; i++) {

    overLayItem = mOverlays.get(i);

    Drawable marker = overLayItem.getMarker(0);
    //marker.getBounds()
    /* 象素点取得{?*/
    projection.toPixels(overLayItem.getPoint(), point);

    if (marker != null) {
     boundCenterBottom(marker);
    }

    /* 圆圈 */
    //Paint paintCircle = new Paint();
    //paintCircle.setColor(Color.RED);
    paint.setColor(Color.RED);
    canvas.drawCircle(point.x, point.y, 5, paint);

    /* 文字讄 */
    /* 标题 */
    String title = overLayItem.getTitle();
    /* ?*/
    //    String snippet = overLayItem.getSnippet();
    //
    //    StringBuffer txt = new StringBuffer();
    //    if (title != null && !"".equals(title))
    //     txt.append(title);
    //
    //    if (snippet != null && !"".equals(snippet)) {
    //     if (txt.length() > 0) {
    //      txt.append(":");
    //     }
    //     txt.append(snippet);
    //    }    
    //Paint paintText = new Paint();

    if (title != null && title.length() > 0) {
     paint.setColor(Color.BLACK);
     paint.setTextSize(15);
     canvas.drawText(title, point.x, point.y, paint);
    }

   }

   //ȝ

   boolean prevInBound = false;//前一个点是否在可视区?br />    Point prev = null;
   int mapWidth = mapView.getWidth();
   int mapHeight = mapView.getHeight();
   //Paint paintLine = new Paint();
   paint.setColor(Color.RED);
   //paint.setPathEffect(new CornerPathEffect(10));
   paint.setStrokeWidth(2);
   int count = linePoints.size();

   //Path path = new Path();
   //path.setFillType(Path.FillType.INVERSE_WINDING);
   for (int i = 0; i < count; i++) {
    GeoPoint geoPoint = linePoints.get(i);
    //projection.toPixels(geoPoint, point); //q一行似乎有问题
    point = projection.toPixels(geoPoint, null);
    if (prev != null) {
     if (point.x >= 0 && point.x <= mapWidth && point.y >= 0 && point.y <= mapHeight) {
      if ((Math.abs(prev.x - point.x) > 2 || Math.abs(prev.y - point.y) > 2)) {
       //q里判断Ҏ(gu)否重合,重合的不ȝQ可能会(x)Dȝ不在路上
       canvas.drawLine(prev.x, prev.y, point.x, point.y, paint);
       //path.lineTo(point.x, point.y);

       prev = point;
       prevInBound = true;

      }
     } else {
      //在可视区与之?br />       if (prevInBound) {//前一个点在可视区域内Q也需要划U?br />        //path.lineTo(point.x, point.y);
       canvas.drawLine(prev.x, prev.y, point.x, point.y, paint);
      }
      prev = point;
      prevInBound = false;
     }
    } else {
     //path.moveTo(point.x, point.y);
     prev = point;

    }
   }
   //canvas.drawPath(path, paint);
   canvas.restore();
   //DebugUtils.showMemory();
  }
  super.draw(canvas, mapView, shadow);
 }

}



]]>
tomcat reload时内存泄漏的处理http://www.aygfsteel.com/super/archive/2010/06/30/324916.html王卫?/dc:creator>王卫?/author>Wed, 30 Jun 2010 10:10:00 GMThttp://www.aygfsteel.com/super/archive/2010/06/30/324916.htmlhttp://www.aygfsteel.com/super/comments/324916.htmlhttp://www.aygfsteel.com/super/archive/2010/06/30/324916.html#Feedback1http://www.aygfsteel.com/super/comments/commentRss/324916.htmlhttp://www.aygfsteel.com/super/services/trackbacks/324916.html我做的应用是以Spring为系l的基础框架,mysql为后台数据库.在tomcat上发布后,L不能q行热部|?reload),多次reload?׃(x)出OutOfMemory PermGen,

为此?ch)恼了(jin)很?M下定军_(j)找找Ҏ(gu).
l过3天的不懈努力,有成果,记录下来

实际上下面的分析都已l没什么用?如果你用tomcat6.0.26?qing)以后的版?我所说的q些情况都已l被处理?q且比我处理的还要多很多.可以下蝲tomcat6.0.26的源代码
看看WebappClassLoadercȝ处理成?

 

通过分析工具的分?用了(jin)YourKit,以及(qing)JDK1.6/bin下的jps/jmap/jhat),发现有下面几个方面会(x)造成memory leak.

1.SystemClassLoader与WebappClassLoader加蝲的类怺引用,tomcat reload只是卸蝲WebappClassloader中的class,SystemClassLoader是不?x)卸载?否则其他应用也停止了(jin)).但是WebappClassloader加蝲的类被SystemClassLoader引用的化,WebappClassloader中的相关cd不会(x)被JVMq行垃圾攉

目前发现2U容易生这Uleak的现?
a.在用java.lang.ThreadLocal的时候很Ҏ(gu)产生q种情况
b.使用jdbc驱动,而且不是在tomcat中配|的公共q接?则java.sql.DriverManager一定会(x)产生q种现象


ThreadLocal.set(Object),如果q个Object是WebappsClassLoader加蝲?使用之后没有做ThreadLocal.set(null)或者ThreadLocal.remove(),׃(x)产生memory leak.
׃ThreadLocal实际上操作的是java.lang.ThreadcM的ThreadLocalMap,ThreadcL由SystemClassLoder加蝲?而这个线E实?main thread)在tomcat reload的时候不?x)销毁重?必然׃生了(jin)SystemClassLoder中的cd用WebappsClassLoader的类.

DriverManager也是由SystemClassLoder载入?当初始化某个JDBC驱动的时??x)向DriverManager中注册该驱动,通常?**.driver,例如com.mysql.jdbc.Driver
q个Driver是通过class.forName()加蝲?通常也是加蝲到WebappClassLoader.q就出现?jin)两个classLoader中的cȝ交叉引用.Dmemory leak.

 

解决办法:
写一个ServletContextListener,在contextDestroyedҎ(gu)中统一删除当前Thread的ThreadLocalMap中的内容.
public class ApplicationCleanListener implements ServletContextListener {

 public void contextInitialized(ServletContextEvent event) {
 }

 public void contextDestroyed(ServletContextEvent event) {
         //处理ThreadLocal
  ThreadLocalCleanUtil.clearThreadLocals();

  /*
   * 如果数据故驱动是通过应用服务?tomcat etc...)中配|的<公用>q接?q里不需?否则必须卸蝲Driver
   *
   * 原因: DriverManager是System classloader加蝲? Driver是webappclassloader加蝲?
   * driver保存在DriverManager?在reloadq程?׃system
   * classloader不会(x)销?driverManager׃直保持着对driver的引?
   * driver无法卸蝲,与driver兌的其他类
   * ,例如DataSource,jdbcTemplate,dao,service....都无法卸?br />    */
  try {
   System.out.println("clean jdbc Driver......");
   for (Enumeration e = DriverManager.getDrivers(); e
     .hasMoreElements();) {
    Driver driver = (Driver) e.nextElement();
    if (driver.getClass().getClassLoader() == getClass()
      .getClassLoader()) {
     DriverManager.deregisterDriver(driver);
    }
   }

  } catch (Exception e) {
   System.out
     .println("Exception cleaning up java.sql.DriverManager's driver: "
       + e.getMessage());
  }


 }

}


/**
 * q个cL?br /> */
public class ThreadLocalCleanUtil {

 /**
  * 得到当前U程l中的所有线E?description:
  *
  * @return
  */
 private static Thread[] getThreads() {
  ThreadGroup tg = Thread.currentThread().getThreadGroup();

  while (tg.getParent() != null) {
   tg = tg.getParent();
  }

  int threadCountGuess = tg.activeCount() + 50;
  Thread[] threads = new Thread[threadCountGuess];
  int threadCountActual = tg.enumerate(threads);

  while (threadCountActual == threadCountGuess) {
   threadCountGuess *= 2;
   threads = new Thread[threadCountGuess];

   threadCountActual = tg.enumerate(threads);
  }

  return threads;
 }

 public static void clearThreadLocals() {
  ClassLoader classloader = Thread
    .currentThread()
    .getContextClassLoader();

  Thread[] threads = getThreads();
  try {
   Field threadLocalsField = Thread.class
     .getDeclaredField("threadLocals");

   threadLocalsField.setAccessible(true);
   Field inheritableThreadLocalsField = Thread.class
     .getDeclaredField("inheritableThreadLocals");

   inheritableThreadLocalsField.setAccessible(true);

   Class tlmClass = Class
     .forName("java.lang.ThreadLocal$ThreadLocalMap");

   Field tableField = tlmClass.getDeclaredField("table");
   tableField.setAccessible(true);

   for (int i = 0; i < threads.length; ++i) {
    if (threads[i] == null)
     continue;
    Object threadLocalMap = threadLocalsField.get(threads[i]);
    clearThreadLocalMap(threadLocalMap, tableField, classloader);

    threadLocalMap = inheritableThreadLocalsField.get(threads[i]);

    clearThreadLocalMap(threadLocalMap, tableField, classloader);
   }
  } catch (Exception e) {

   e.printStackTrace();
  }
 }

 private static void clearThreadLocalMap(Object map,
   Field internalTableField, ClassLoader classloader)
   throws NoSuchMethodException, IllegalAccessException,
   NoSuchFieldException, InvocationTargetException {
  if (map != null) {
   Method mapRemove = map.getClass().getDeclaredMethod("remove",
     new Class[] { ThreadLocal.class });

   mapRemove.setAccessible(true);
   Object[] table = (Object[]) internalTableField.get(map);
   int staleEntriesCount = 0;
   if (table != null) {
    for (int j = 0; j < table.length; ++j) {
     if (table[j] != null) {
      boolean remove = false;

      Object key = ((Reference) table[j]).get();
      if ((key != null)
        && (key.getClass().getClassLoader() == classloader)) {
       remove = true;

       System.out.println("clean threadLocal key,class="
         + key.getClass().getCanonicalName()
         + ",value=" + key.toString());
      }

      Field valueField = table[j]
        .getClass()
        .getDeclaredField("value");

      valueField.setAccessible(true);
      Object value = valueField.get(table[j]);

      if ((value != null)
        && (value.getClass().getClassLoader() == classloader)) {
       remove = true;
       System.out.println("clean threadLocal value,class="
         + value.getClass().getCanonicalName()
         + ",value=" + value.toString());

      }

      if (remove) {

       if (key == null)
        ++staleEntriesCount;
       else {
        mapRemove.invoke(map, new Object[] { key });
       }
      }
     }
    }
   }
   if (staleEntriesCount > 0) {
    Method mapRemoveStale = map
      .getClass()
      .getDeclaredMethod("expungeStaleEntries", new Class[0]);

    mapRemoveStale.setAccessible(true);
    mapRemoveStale.invoke(map, new Object[0]);
   }
  }
 }
}

 

2.对于使用mysql JDBC驱动?mysql JDBC驱动?x)启动一个Timer Thread,q个U程在reload的时候也是无法自动销?
  因此,需要强制结束这个timer
 
  可以?上面的ApplicationCleanListener中加入如下代?

    try {
   Class ConnectionImplClass = Thread
     .currentThread()
     .getContextClassLoader()
     .loadClass("com.mysql.jdbc.ConnectionImpl");
   if (ConnectionImplClass != null
     && ConnectionImplClass.getClassLoader() == getClass()
       .getClassLoader()) {
    System.out.println("clean mysql timer......");
    Field f = ConnectionImplClass.getDeclaredField("cancelTimer");
    f.setAccessible(true);
    Timer timer = (Timer) f.get(null);
    timer.cancel();
   }
  } catch (java.lang.ClassNotFoundException e1) {
   // do nothing
  } catch (Exception e) {
   System.out
     .println("Exception cleaning up MySQL cancellation timer: "
       + e.getMessage());
  }

 


3.common-logging+log4jg也会(x)Dleak,看网上有在ApplicationCleanListene6中加入这行代码就可以:
 LogFactory.release(Thread.currentThread().getContextClassLoader());

  我没试成?懒得再找原因,直接换成?jin)slf4j+logback,没有问题.据说slf4j+logback的性能q要更好.

 

 
后记:
 tomcat-6.0.26之前的版?我用的是tomcat-6.0.18),加入上述ApplicationCleanListener?多次reload,不会(x)出现outOfMemory.
 但要注意,W一ơ启动后,reload一?内存?sh)(x)增?也就是看着q是由memory Leak,但是重复reload,内存始终保持在第一ơreload的大?gtomcat始终保留?jin)双W(xu)ebappClassLoader.因此,配置内存要小?j)?臛_要保证能够load两倍的你的所有jar包的大小(当然,是指Perm的内存大?.
 
 试q程中最好加?JVM参数 -verbosegc,q样,在做GC的时候可以直观的看到class被卸?

 

 

 

 



]]>
tomcat ssl的配|?/title><link>http://www.aygfsteel.com/super/archive/2009/04/02/263551.html</link><dc:creator>王卫?/dc:creator><author>王卫?/author><pubDate>Thu, 02 Apr 2009 07:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/super/archive/2009/04/02/263551.html</guid><wfw:comment>http://www.aygfsteel.com/super/comments/263551.html</wfw:comment><comments>http://www.aygfsteel.com/super/archive/2009/04/02/263551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/super/comments/commentRss/263551.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/super/services/trackbacks/263551.html</trackback:ping><description><![CDATA[<div><br /> <br /> keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -keypass changeit -storepass changeit -keystore tomcat.keystore -validity 3600</div> <div> </div> <div>--q两步可以不?/div> <div>keytool -export -trustcacerts -alias tomcat -file tomcat.cer -keystore  tomcat.keystore -storepass changeit<br /> keytool -import -trustcacerts -alias tomcat -file tomcat.cer -keystore  %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit</div> <div> </div> <div> </div> <div>Tomcat4.1.34配置Q?br /> <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"             port="8443" enableLookups="true" scheme="https" secure="true"             acceptCount="100"             useURIValidationHack="false" disableUploadTimeout="true"             clientAuth="false" sslProtocol="TLS"               keystoreFile="tomcat.keystore"               keystorePass="changeit"/>  </div> <div>Tomcat5.5.9配置Q?nbsp; <br />    <br /> <Connector port="8443" maxHttpHeaderSize="8192"   <br />            maxThreads="150" minSpareThreads="25" maxSpareThreads="75"   <br />            enableLookups="false" disableUploadTimeout="true"   <br />            acceptCount="100" scheme="https" secure="true"   <br />            clientAuth="false" sslProtocol="TLS"     <br />            keystoreFile="tomcat.keystore"     <br />            keystorePass="changeit"/>   </div> <div>Tomcat5.5.20配置(此配|同样可用于Tomcat6.0)Q?br /> <Connector protocol="org.apache.coyote.http11.Http11Protocol"     <br />                      port="8443" maxHttpHeaderSize="8192"   <br />            maxThreads="150" minSpareThreads="25" maxSpareThreads="75"   <br />            enableLookups="false" disableUploadTimeout="true"   <br />            acceptCount="100" scheme="https" secure="true"   <br />            clientAuth="false" sslProtocol="TLS"                    <br />            keystoreFile="tomcat.keystore"     <br />            keystorePass="changeit"/>   </div> <div>Tomcat6.0.10配置Q?br /> <Connector protocol="org.apache.coyote.http11.Http11NioProtocol"   <br />            port="8443" minSpareThreads="5" maxSpareThreads="75"   <br />            enableLookups="true" disableUploadTimeout="true"     <br />            acceptCount="100"  maxThreads="200"   <br />            scheme="https" secure="true" SSLEnabled="true"   <br />            clientAuth="false" sslProtocol="TLS"   <br />            keystoreFile="D:/tools/apache-tomcat-6.0.10/tomcat.keystore"     <br />            keystorePass="changeit"/>   </div> <div>    </div> <div><br /> 其他有用keytool命o(h)Q列Z任证书库中所有已有证书,删除库中某个证书Q:(x)<br /> keytool -list -v -keystore D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts<br /> keytool -delete -trustcacerts -alias tomcat  -keystore  D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts -storepass changeit<br /> </div> <img src ="http://www.aygfsteel.com/super/aggbug/263551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/super/" target="_blank">王卫?/a> 2009-04-02 15:14 <a href="http://www.aygfsteel.com/super/archive/2009/04/02/263551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DocumentBuilderFactory.newInstance()查找DocumentBuilderFactory实现cȝq程http://www.aygfsteel.com/super/archive/2009/01/06/250083.html王卫?/dc:creator>王卫?/author>Tue, 06 Jan 2009 05:23:00 GMThttp://www.aygfsteel.com/super/archive/2009/01/06/250083.htmlhttp://www.aygfsteel.com/super/comments/250083.htmlhttp://www.aygfsteel.com/super/archive/2009/01/06/250083.html#Feedback0http://www.aygfsteel.com/super/comments/commentRss/250083.htmlhttp://www.aygfsteel.com/super/services/trackbacks/250083.html 2.如果1没有扑ֈQ则找java.home\lib\jaxp.properties 文gQ如果文件存在,在文件中查找key=javax.xml.parsers.DocumentBuilderFactory
3.如果2没有扑ֈ,则在classpath中的所有的jar包中查找META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文g
    全都没找刎ͼ则返回null


]]>
Z角色的访问控?/title><link>http://www.aygfsteel.com/super/archive/2007/03/14/103810.html</link><dc:creator>王卫?/dc:creator><author>王卫?/author><pubDate>Wed, 14 Mar 2007 08:24:00 GMT</pubDate><guid>http://www.aygfsteel.com/super/archive/2007/03/14/103810.html</guid><wfw:comment>http://www.aygfsteel.com/super/comments/103810.html</wfw:comment><comments>http://www.aygfsteel.com/super/archive/2007/03/14/103810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/super/comments/commentRss/103810.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/super/services/trackbacks/103810.html</trackback:ping><description><![CDATA[最q公司要?span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Z角色的访问控制的模块Q?br />自己查了(jin)些资料,自己胡ؕ写了(jin)一些,q(sh)成熟?br /><br /><a href="/Files/super/RBAC">http://www.aygfsteel.com/Files/super/RBAC</a>-权限理--设计说明?rar<br /><a href="/Files/super/RBAC.rar">http://www.aygfsteel.com/Files/super/RBAC.rar</a></span><img src ="http://www.aygfsteel.com/super/aggbug/103810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/super/" target="_blank">王卫?/a> 2007-03-14 16:24 <a href="http://www.aygfsteel.com/super/archive/2007/03/14/103810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOJO.widget的性能问题http://www.aygfsteel.com/super/archive/2006/12/12/87315.html王卫?/dc:creator>王卫?/author>Tue, 12 Dec 2006 09:46:00 GMThttp://www.aygfsteel.com/super/archive/2006/12/12/87315.htmlhttp://www.aygfsteel.com/super/comments/87315.htmlhttp://www.aygfsteel.com/super/archive/2006/12/12/87315.html#Feedback1http://www.aygfsteel.com/super/comments/commentRss/87315.htmlhttp://www.aygfsteel.com/super/services/trackbacks/87315.html对DOJO基本上算是文Ԍ只是目中需要一些特效页面,在网上找?jin)找Q感觉DOJO做的不错Q就拿过来用?jin),不过感觉性能很不好,面h明显q钝

 (tng) (tng) (tng)我的面上大概有10几个DOJOQ刷一ơ页面仅仅因为DOJO的widget的初始化的问题就?-6U钟Q读?jin)一下DOJO的代码,只要的时间都p在dojo.hostenv.makeWidgetsq个Ҏ(gu)中,本h的js水^比较低,基本上改不了(jin)DOJO的代码,不过在这个方法中却找C(jin)一个稍微提高(sh)性能的办法,q就?djConfig.searchIds的用?br />
dojo.hostenv.makeWidgets = function(){
 (tng)// you can put searchIds in djConfig and dojo.hostenv at the moment
 (tng)// we should probably eventually move to one or the other
 (tng)var sids = [];
 (tng)if(djConfig.searchIds && djConfig.searchIds.length > 0) {
 (tng) (tng)sids = sids.concat(djConfig.searchIds);
 (tng)}
 (tng)if(dojo.hostenv.searchIds && dojo.hostenv.searchIds.length > 0) {
 (tng) (tng)sids = sids.concat(dojo.hostenv.searchIds);
 (tng)}

 (tng)if((djConfig.parseWidgets)||(sids.length > 0)){
 (tng) (tng)if(dojo.evalObjPath("dojo.widget.Parse")){
 (tng) (tng) (tng)// we must do this on a delay to avoid:
 (tng) (tng) (tng)// (tng)http://www.shaftek.org/blog/archives/000212.html
 (tng) (tng) (tng)// IE is such a tremendous peice of shit.
 (tng) (tng) (tng) (tng)var parser = new dojo.xml.Parse();
 (tng) (tng) (tng) (tng)if(sids.length > 0){
 (tng) (tng) (tng) (tng) (tng)for(var x=0; x<sids.length; x++){
 (tng) (tng) (tng) (tng) (tng) (tng)var tmpNode = document.getElementById(sids[x]);
 (tng) (tng) (tng) (tng) (tng) (tng)if(!tmpNode){ continue; }
 (tng) (tng) (tng) (tng) (tng) (tng)var frag = parser.parseElement(tmpNode, null, true);
 (tng) (tng) (tng) (tng) (tng) (tng)dojo.widget.getParser().createComponents(frag);
 (tng) (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)}else if(djConfig.parseWidgets){
 (tng) (tng) (tng) (tng) (tng)var frag (tng) = parser.parseElement(document.getElementsByTagName("body")[0] || document.body, null, true);
 (tng) (tng) (tng) (tng) (tng)dojo.widget.getParser().createComponents(frag);
 (tng) (tng) (tng) (tng)}
 (tng) (tng)}
 (tng)}
}

具体使用Ҏ(gu)是在自q面上把所有的dojo的widget都要定义IDQ类D?br />
<input id="queryStr_0" name="queryStr_0" dojoType="ComboBox" style="width:280px;" autocomplete="false" >


然后加上q样一Djs
<script language=javascript>
 (tng)djConfig.searchIds=['queryStr_0','queryStr_1','queryStr_2'];
</script>
q里?queryStr_0'之类的就是你的widget的ID,q样对于我的10几个widget的页面,速度基本上会(x)快上1-2倍?br />



]]>
JSON-RPC的另cȝ?/title><link>http://www.aygfsteel.com/super/archive/2006/11/27/83815.html</link><dc:creator>王卫?/dc:creator><author>王卫?/author><pubDate>Mon, 27 Nov 2006 08:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/super/archive/2006/11/27/83815.html</guid><wfw:comment>http://www.aygfsteel.com/super/comments/83815.html</wfw:comment><comments>http://www.aygfsteel.com/super/archive/2006/11/27/83815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/super/comments/commentRss/83815.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/super/services/trackbacks/83815.html</trackback:ping><description><![CDATA[JSON-RPC 大家都知道了(jin),我比较反感JSON-RPC的客L(fng)/服务器端的交互方式,个h认ؓ(f)q是DWR的框架似乎好一些,不过单纯比较后台代码的风|gJSON-RPC的代码更好些---Ua(b)个h喜好?br /><br /> (tng) (tng) (tng)虽然不喜ƢJSON-RPC的框Ӟ不过对于JSON的javaObject--javascriptObject的{换代码倒是很欣赏,因此直接把JSON-RPC的这部分代码直接拿过来用Q感觉也不错。当?dng)q已l跟AJAX关系不大?jin)?br /><br /> (tng) (tng) (tng)1.jsonrpc-1.0.jar包含在你的project的classpath中,<br /> (tng) (tng) (tng)2.写个单的Utilc,你的java Object 序列化成javascript的字W串?br /><br />public class JSONUtil {<br /> (tng)public static final JSONSerializer se = new JSONSerializer();<br /> (tng)private static Logger log = Logger.getLogger(JSONUtil.class); (tng)<br /> (tng)static <br /> (tng){<br /> (tng) (tng)try<br /> (tng) (tng){<br /> (tng) (tng) (tng)se.registerDefaultSerializers();<br /> (tng) (tng)}<br /> (tng) (tng)catch (Exception e)<br /> (tng) (tng){<br /> (tng) (tng) (tng)log.error(e);<br /> (tng) (tng)}<br /> (tng)}<br /> (tng)<br /> (tng)public static String toJSON(Object obj)<br /> (tng){<br /> (tng) (tng)try<br /> (tng) (tng){<br /> (tng) (tng) (tng)SerializerState state = new SerializerState();<br /> (tng) (tng) (tng)Object retuObj = se.marshall(state, obj);<br /> (tng) (tng) (tng)String retuStr = retuObj.toString();<br /> (tng) (tng) (tng)//retuStr.replaceAll("<a>\\\</a>"", "<a href="file://\\'">\\'</a>");<br /> (tng) (tng) (tng)//log.debug("JSONStr:"+retuStr);<br /> (tng) (tng) (tng)return retuStr;<br /> (tng) (tng)}<br /> (tng) (tng)catch (Exception e){<br /> (tng) (tng) (tng)log.error(e);<br /> (tng) (tng) (tng)return obj.toString();<br /> (tng) (tng)}<br /> (tng)}<br /><br /><br />3. (tng) (tng) (tng)客户端的jsp中只要简单的加上q段js<br /><script language=javascript><br /> (tng)eval('jsObject = <%=JSONUtil.toJSON(javaObject)%>'+';');<br /></script><br />javaObject是你自己的javacȝ实例Q这样你可以在js中直接操作jsObject q个js对象?jin)?br /><br /><br /><br /><img src ="http://www.aygfsteel.com/super/aggbug/83815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/super/" target="_blank">王卫?/a> 2006-11-27 16:14 <a href="http://www.aygfsteel.com/super/archive/2006/11/27/83815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAXq回XML格式文本的读取方?/title><link>http://www.aygfsteel.com/super/archive/2006/11/27/83811.html</link><dc:creator>王卫?/dc:creator><author>王卫?/author><pubDate>Mon, 27 Nov 2006 08:02:00 GMT</pubDate><guid>http://www.aygfsteel.com/super/archive/2006/11/27/83811.html</guid><wfw:comment>http://www.aygfsteel.com/super/comments/83811.html</wfw:comment><comments>http://www.aygfsteel.com/super/archive/2006/11/27/83811.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/super/comments/commentRss/83811.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/super/services/trackbacks/83811.html</trackback:ping><description><![CDATA[ <p>对于一个AJAXh<br />如果q回的是标准的XML(?lt;?xml version="1.0" encoding="UTF-8"?>,q且ContentType = "text/xml")Q则直接操作xmlhttp.responseXML应该是可以的,比如Q?br />var requestMsg=xmlhttp.responseXML;<br />alert(requestMsg.getElementsByTagName("book").length);<br /><br />如果不是标准的XML.则返回的信息实际上是以文本的方式表示的,必须从xmlhttp.responseText中取得数据,方式如下Q?br />var requestMsg=getXMLDoc(originalRequest.responsetext);<br />alert(requestMsg.getElementsByTagName("book").length);<br /><br /><br />getXMLDocҎ(gu)如下:<br /><br /> (tng)function getXMLDoc(xmlText){<br /> (tng) (tng)if(window.ActiveXObject){<br /> (tng) (tng) (tng)xmlDoc=new ActiveXObject("Microsoft.XMLDOM");<br /> (tng) (tng) (tng)xmlDoc.async=false;<br /> (tng) (tng) (tng)xmlDoc.onreadystatechange = function() <br /> (tng) (tng) (tng){<br /> (tng) (tng) (tng) (tng)//if(xmlDoc.readyState == 4) doAction();<br /> (tng) (tng) (tng)}<br /> (tng) (tng) (tng)xmlDoc.loadXML(xmlText);<br /> (tng) (tng)}else if(document.implementation&&document.implementation.createDocument){<br /> (tng) (tng) (tng)xmlDoc=document.implementation.createDocument('','',null);<br /> (tng) (tng) (tng)//xmlDoc.onload=doAction();<br /> (tng) (tng) (tng)xmlDoc.loadXML(xmlText);<br /> (tng) (tng)}else return null;<br /> (tng) (tng)return xmlDoc;<br /> (tng)}<br /></p> <img src ="http://www.aygfsteel.com/super/aggbug/83811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/super/" target="_blank">王卫?/a> 2006-11-27 16:02 <a href="http://www.aygfsteel.com/super/archive/2006/11/27/83811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϸ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">Ů</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">崨</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ij</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">差</a>| <a href="http://" target="_blank">е</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ؼ</a>| <a href="http://" target="_blank">ɼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank">Ž</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̽</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">J</a>| <a href="http://" target="_blank">ػ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>