每隔幾秒查詢資料庫,操作頻繁,導致控制檯報錯too many connection,解決方案連線池
阿新 • • 發佈:2018-11-11
原因:傳統的增刪改查已經滿足不了對資料庫的頻繁操作了;
解決方案:資料庫連線池-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); } } }
報錯:錯誤原因,百度直接複製了別人程式碼;