Mysql连接超时解决方案2: 配置Proxool连接池

MySQL数据库默认的连接超时时间为8h(即wait_timeout=28800s),如果一个连接闲置时间超过8h,MySQL会主动断开这个连接。用proxool连接池可以解决Mysql自动断开重连的问题,它具有移植性好,快速、成熟、健壮等特性,同时还提供了可视化的连接池实时监控工具。proxool连接池配置如下:

1、下载相关JAR包;

从Maven Repository仓库中下载proxool相关jar包,并将proxool-0.9.1.jar和proxool-cglib.jar拷贝至项目中。

2、在WEB-INF目录下新建一个proxool.xml文件,配置如下:

   
  
      
        dbname   
         jdbc:mysql://localhost:3306/testdb  
        com.mysql.jdbc.Driver    
          
               
              
           
          
        100   
          
        10   
          
        90000  
          
        10
		
300000 
          
        5   
          
        true  
          
        select sysdate from dual  
  
   
         dbname2   
        jdbc:oracle:thin:@localhost:1521:testdb2  
        oracle.jdbc.driver.OracleDriver   
           
               
               
           
        100   
        10   
90000   
        10   
        300000
5   
        true
        select sysdate from dual
    

这里面你可以根据需要配置多个不同数据库的数据源。

3、配置web.xml文件;

  
  
  
  ServletConfigurator  
  org.logicalcobwebs.proxool.configuration.ServletConfigurator  
    
    xmlFile  
    WEB-INF/proxool.xml  
    
  1  
 


  
  Admin  
  org.logicalcobwebs.proxool.admin.servlet.AdminServlet  
  
  
  Admin  
  /admin  


  
  
    
      proxool   
      /admin  
    
    
     manager 
    
   
  
    The role that is required to log in to the Manager Application   
    manager   
  
  
    401  
    /401.jsp  

在应用启动后访问:http://localhost:8080//admin这个url即可监控。

Mysql连接超时解决方案2: 配置Proxool连接池_第1张图片

注意:

1、配置proxool连接池监控,仅需配置;

2、配置tomcat manager查看连接池信息时,需要在401.jsp页面中添加如下配置:

<%response.setHeader("WWW-Authenticate", "Basic realm=\"Tomcat Manager Application\"");%>这句话,

否则在访问/admin察看连接池信息时,会直接跳转到401.jsp页面。

4、通过Java API配置连接池,获取连接池信息;

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement;
import org.logicalcobwebs.proxool.ProxoolException; 
import org.logicalcobwebs.proxool.ProxoolFacade; 
import org.logicalcobwebs.proxool.admin.SnapshotIF; 

public class PoolManager {
    private static int activeCount = 0; 
    public PoolManager(){   } 
    /** 
     * 获取连接 
     * getConnection 
     * @param name 
     * @return
     */
    public Connection getConnection() { 
        Connection conn = null;
        try{ 
            //proxool驱动类 
            Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); 
            //此处的dbname是在proxool.xml中配置的连接池别名,当然根据需要可以用dbname2
            conn = DriverManager.getConnection("proxool.dbname"); 
            showSnapshotInfo(); 
        }catch(Exception ex){
            ex.printStackTrace(); 
        } 
        return conn;
    }
           
    /**        
     * 此方法可以得到连接池的信息 
     * showSnapshotInfo 
     */ 
    private void showSnapshotInfo(){           
        try{           
            SnapshotIF snapshot = ProxoolFacade.getSnapshot("dbname", true); 
	    //获得活动连接数
            int curActiveCount=snapshot.getActiveConnectionCount(); 
            //获得可得到的连接数
            int availableCount=snapshot.getAvailableConnectionCount(); 
            //获得总连接数
            int maxCount=snapshot.getMaximumConnectionCount() ; 
            //当活动连接数变化时输出的信息
            if(curActiveCount!=activeCount) {           
                System.out.println("活动连接数:"+curActiveCount+",(active)可得到的连接数:"+availableCount+",(available)总连接数:"+maxCount+"(max)"); 
                activeCount=curActiveCount; 
            } 
        }catch(ProxoolException e){ 
            e.printStackTrace(); 
        } 
    }
    
    /** 
     * 获取连接 
     * getConnection 
     * @param name 
     * @return 
     */ 
    public Connection getConnection(String name){ 
        return getConnection(); 
    }

    /** 
     * 释放连接 
     * freeConnection
     * @param conn 
     */ 
    public void freeConnection(Connection conn){
        if(conn!=null){ 
            try { 
                conn.close(); 
            } catch (SQLException e) { 
                e.printStackTrace(); 
            } 
        } 
    }
   
    /** 
     * 释放连接 
     * freeConnection 
     * @param name 
     * @param con 
     */          
    public void freeConnection (String name,Connection con){ 
        freeConnection(con); 
    } 
    
    public void getQuery() { 
        try { 
            Connection conn = getConnection(); 
            if(conn != null){ 
                Statement statement = conn.createStatement(); 
                ResultSet rs = statement.executeQuery("select * from Users"); 
                int c = rs.getMetaData().getColumnCount(); 
                while(rs.next()){ 
                    System.out.println(); 
                    for(int i=1;i<=c;i++){ 
                        System.out.print(rs.getObject(i)); 
                    } 
                } 
                rs.close(); 
            } 
            freeConnection(conn); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
    }
}

 

你可能感兴趣的:(Mysql,Java,mysql,proxool连接池,连接超时)