zoukankan      html  css  js  c++  java
  • 数据库连接池之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();// 连接还给连接池,而不是关闭连接
            
        }
    }
    

      

  • 相关阅读:
    多线程之生产者和消费者模式
    python多线程之线程同步--锁
    python多线程之动态确定线程数
    python多线程之循环,调用函数等
    V8 引擎是如何工作的?
    AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
    字节码
    V8 引擎是如何工作的?
    JavaScript arguments对象
    V8 是怎么跑起来的 —— V8 中的对象表示
  • 原文地址:https://www.cnblogs.com/jet-angle/p/9936303.html
Copyright © 2011-2022 走看看