1. 程式人生 > >每隔幾秒查詢資料庫,操作頻繁,導致控制檯報錯too many connection,解決方案連線池

每隔幾秒查詢資料庫,操作頻繁,導致控制檯報錯too many connection,解決方案連線池

原因:傳統的增刪改查已經滿足不了對資料庫的頻繁操作了;

解決方案:資料庫連線池-DBCP連線池

資料庫連線池-DBCP連線池

所需的jar包:

 配置檔案:

dbcpconfig.properties

這個檔案需要放在src的根目錄下面,和其他的包是同一個級別的

 這個檔案的配置內容如下:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/lf
username=root
password=root
 
initialSize=10
 
maxActive=50
 
maxIdle=20
 
minIdle=5
 
maxWait=60000
 
connectionProperties=useUnicode=true;characterEncoding=utf8
 
defaultAutoCommit=true

 2.資料庫連線池類檔案如下:

package cn.com.jdbc;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

/**
* @ClassName: JdbcUtils_DBCP
* @Description: 資料庫連線工具類
* @author: 命運的信徒
* @date: 2018-10-13 
*
*/ 
public class JdbcUtils_DBCP {
    /**
     * 在java中,編寫資料庫連線池需實現java.sql.DataSource介面,每一種資料庫連線池都是DataSource介面的實現
     * DBCP連線池就是java.sql.DataSource介面的一個具體實現
     */
    private static DataSource ds = null;
    //在靜態程式碼塊中建立資料庫連線池
    static{
        try{
            //載入dbcpconfig.properties配置檔案
            InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            Properties prop = new Properties();
            prop.load(in);
            //建立資料來源
            ds = BasicDataSourceFactory.createDataSource(prop);
        }catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }
    
    /**
    * @ClassName: JdbcUtils_DBCP
    * @Description: 資料庫連線工具類
    * @author: 命運的信徒
    * @date: 2018-10-13 
    *
    */
    public static Connection getConnection() throws SQLException{
        //從資料來源中獲取資料庫連線
        return ds.getConnection();
    }
    
    /**
    * @Method: release
    * @Description: 釋放資源,
    * 釋放的資源包括Connection資料庫連線物件,負責執行SQL命令的Statement物件,儲存查詢結果的ResultSet物件
    * @param conn
    * @param st
    * @param rs
    */
    public static void release(Connection conn,Statement st,ResultSet rs){
        if(rs!=null){
            try{
                //關閉儲存查詢結果的ResultSet物件
                rs.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(st!=null){
            try{
                //關閉負責執行SQL命令的Statement物件
                st.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        if(conn!=null){
            try{
                //將Connection連線物件還給資料庫連線池
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 測試類如下:

package cn.com.lf;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import cn.com.jdbc.JdbcUtils_DBCP;
public class QQ {  
    @Test
    public void dbcpDataSourceTest() {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try{
            //獲取資料庫連線
            conn = JdbcUtils_DBCP.getConnection();
            String sql = "insert into user values(?,?,?)";
            st = conn.prepareStatement(sql);
            st.setString(1, "047");
            st.setString(2, "wwww");
            st.setString(3, "eee");
            st.executeUpdate();
          
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            //釋放資源
            JdbcUtils_DBCP.release(conn, st, rs);
        }
    }
}

報錯:錯誤原因,百度直接複製了別人程式碼;