db2 jdbc 连接池_数据库连接池之DB2

最近项目开发遇到一个问题,当数据量过大时会导致系统崩溃,经过排查,发现是每一次操作数据库都建立一次数据连接,当数据量太大,就会导致程序无法负载从而宕机。

而后进行代码改造,改用数据库连接池。目前使用数据库连接池有两种方式,使用配置文件以及不使用配置文件!

第一种:  不使用配置文件

先决条件: 导入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();// 连接还给连接池,而不是关闭连接

}

}


版权声明:本文为weixin_39692253原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。