最近项目开发遇到一个问题,当数据量过大时会导致系统崩溃,经过排查,发现是每一次操作数据库都建立一次数据连接,当数据量太大,就会导致程序无法负载从而宕机。
而后进行代码改造,改用数据库连接池。目前使用数据库连接池有两种方式,使用配置文件以及不使用配置文件!
第一种: 不使用配置文件
先决条件: 导入c3p0.jar包
代码如下:
package com.wk.cl.jxnx.esb.util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.wk.cl.common.util.CfgTool;
import java.beans.PropertyVetoException;
import java.sql.*;
/**
* @title 数据库操作
* @description 数据库操作
* @since Java5
*/
public class JDBCUtil {
public static String driver = CfgTool.getProjectPropterty("esb.db.jdbc.driver");
public static String url = CfgTool.getProjectPropterty("esb.db.jdbc.url");
public static String user = CfgTool.getProjectPropterty("esb.db.jdbc.user");
public static String password = CfgTool.getProjectPropterty("jxnx.esb.db.jdbc.password");
private static JDBCUtil dbPoll;
private ComboPooledDataSource dbSource;
//静态代码块,一开始我们就执行构造函数加载配置信息
static {
dbPoll = new JDBCUtil();
}
private JDBCUtil() {
try{
dbSource = new ComboPooledDataSource();
dbSource.setUser(user);
dbSource.setPassword(password);
dbSource.setJdbcUrl(url);
dbSource.setDriverClass(driver);
dbSource.setInitialPoolSize(1);
dbSource.setMinPoolSize(2);
dbSource.setMaxPoolSize(10);
dbSource.setMaxStatements(50);
dbSource.setMaxIdleTime(60);
}catch (PropertyVetoException e){
throw new RuntimeException(e);
}
}
//获取实例
public final static JDBCUtil getInstance(){
return dbPoll;
}
/**
* 获取数据库连接
* @param url url
* @param user 用户名
* @param password 密码
* @return 数据库连接
* @throws SQLException
*/
public final Connection getConnection(String url, String user, String password) throws SQLException {
//不使用连接池连接方式
// try {
// Class.forName(driver);
// } catch (ClassNotFoundException e) {
// logger.error("JDBC 驱动加载异常 :[{}]",e.getMessage());
// }
// return DriverManager.getConnection(url, user, password);
try{
return dbSource.getConnection();
}catch (SQLException e){
throw new RuntimeException("无法获取连接", e);
}
}
/**
* 释放数据库相关对象
*
* @param rs 结果集
* @param pstmt 声明
* @param conn 连接
*/
public static void free(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
if (!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
第二种: 使用properties文件
新建一个配置文件:c3p0.properties (注意:名字是固定的。c3p0默认只认识这个名字),具体配置如下:
c3p0.driverClass=com.ibm.db2.jcc.DB2Driver
c3p0.jdbcUrl=jdbc:db2://10.1.1.232:50000/cltest
c3p0.user=db2inst1
c3p0.password=db2inst1
接下来新建C3P0Demo类
/**
* Title: C3P0Demo.java
* File Description:
* @copyright: 2018
* @company: CORSWORK
* @author: guojw
* @version: 1.0
* @date: 2018年11月9日
*/
package com.wk.cl.jxnx.esb.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
/**
* Class Description:
* @author guojw
* 2018年11月9日
*/
public class C3P0Demo {
public void getConByC3P0() throws SQLException
{
DataSource ds = new ComboPooledDataSource();//c3p0自己去读配置文件了,我们啥也不干
Connection conn = ds.getConnection(); //线程池建立连接
System.out.println("conn:"+conn);
String sql = "SELECTS * FROM SERV_AUTHORIZATION";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
}
//关闭连接
rs.close();
pstmt.close();
conn.close();// 连接还给连接池,而不是关闭连接
}
}