zoukankan      html  css  js  c++  java
  • 数据库连接池技术,c3p0

    百度 谷歌  http://commons.apache.org/   可以找到DBCP   ,  这里选择使用C3P0,百度一下。https://www.mchange.com/projects/c3p0/

    在maven 库,找到C3p0添加到MAVEN的版本文件。

    数据库连接池的运行机制

    (1) 程序初始化时创建连接池
    (2) 使用时向连接池申请可用连接
    (3) 使用完毕,将连接返还给连接池
    (4) 程序退出时,断开所有连接,并释放资源

     选择使用最多的版本,复制添加到Maven依赖关系如下:

    到maven项目中添加

    接下来使用,连接一个数据库测试

    public class DbUtil {
        private static Connection conn = null; // 声明Connection对象,Connection接口用于建立与特定数据库的连接,私有private只能在本类调用
        private PreparedStatement pstmt;
        private ResultSet rs;
        // 使用单例模式式创建数据库连接池
        private static ComboPooledDataSource dataSource;
    
        // 连接数据库的构造方法, 1加载驱动, 2建立连接, 3使用sql语句进行数据库操作, 4释放资源。
        // (1)构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有;//
        // (2)构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
        // (3)每个类可以有零个或多个构造方法;(4)不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。
        // (5)构造方法在创建对象时自动执行,一般不能显式地直接调用。
        public static ComboPooledDataSource getDateSource() {
            if (dataSource == null) {
                try {
                    dataSource = new ComboPooledDataSource();
                    // try { 执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 }
                    // 获取连接对象,地址,用户名,密码
                    dataSource.setUser("root"); // 用户名
                    dataSource.setPassword(""); // 密码
                    dataSource.setDriverClass("com.mysql.jdbc.Driver"); // mysql数据库驱动程序,这里可以换成你要的其他数据库驱动程
                    String url = "jdbc:mysql://localhost:3306/dev?characterEncoding=UTF-8";
                    dataSource.setJdbcUrl(url);// 数据库地址
                    dataSource.setInitialPoolSize(5); // 初始化连接数
                    dataSource.setMinPoolSize(1);// 最小连接数
                    dataSource.setMaxPoolSize(10);// 最大连接数
                    dataSource.setMaxStatements(50);// 最长等待时间
                    dataSource.setMaxIdleTime(60);// 最大空闲时间,单位毫秒
    
                    System.out.println(dataSource);
                    // System.out.println("连接mysql数据库成功");// 控制台输出
    
                    // catch { 除非try里面执行代码发生了异常,否则这里的代码不会执行 }
                } catch (Exception e) {
                    // 这将捕获任何发生的异常。另外,还提供e参数,可以在处理异常时使用e参数来获得有关异常的信息。
                    e.printStackTrace();
                }
            }
    
            return dataSource;
    
        }
    
        public static Connection getConnection() {
            if (conn == null) {
                try {
                    conn = getDateSource().getConnection();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            return conn;
        }
    
        /**
         * 主要针对增,删,改的通用方法
         * 
         * @param sql
         *            要执行的SQL语句(insert, delete, updata)
         * @param paramsValue
         *            参数数组,用来处理SQL语句中的占位符参数,如果没有参数,请传入null
         */
        public void update(String sql, String[] str) {
            try {
                // 2. 获取PreparedStatement
                pstmt =getConnection().prepareStatement(sql);
                // 3. 得到参数元数据个数
                int count = pstmt.getParameterMetaData().getParameterCount();
                // 4. 利用参数元数据给SQL语句的占位符需要的参数赋值
                if (str != null && str.length > 0) {
                    for (int i = 0; i < count; i++) {
                        // 循环结束,就是可以给SQL语句完整赋值
                        pstmt.setObject(i + 1, str[i]);
                    }
                }
                // 5. 执行
                pstmt.executeUpdate();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            } finally {
    
                closeAll();
            }
        }
    
        /**
         * 查询语句
         * 
         * @param sql
         *            SQL语句
         * @param params
         *            SQL语句
         * @return ResultSet结果集
         */
        public ResultSet executeQueryRS(String sql, Object[] params) {
            try {
                pstmt =getConnection().prepareStatement(sql);
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
                rs = pstmt.executeQuery();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
            return rs;
        }
    
        /**
         * 获取结果集,并将结果放在List中
         * 
         * @param sql
         *            SQL语句
         * @return List结果集
         */
        public List<Object> excuteQuery(String sql, Object[] params) {
            ResultSet rs = executeQueryRS(sql, params);
            ResultSetMetaData rsmd = null;
            int columnCount = 0;
            try {
                rsmd = rs.getMetaData();
                columnCount = rsmd.getColumnCount();
            } catch (SQLException e1) {
                System.out.println(e1.getMessage());
            }
    
            List<Object> list = new ArrayList<Object>();
    
            try {
                while (rs.next()) {
                    Map<String, Object> map = new HashMap<String, Object>();
                    for (int i = 1; i <= columnCount; i++) {
                        map.put(rsmd.getColumnLabel(i), rs.getObject(i));
                    }
                    list.add(map);
                }
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            } finally {
                closeAll();
            }
    
            return list;
        }
    
        private void closeAll() {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    System.out.println(e.getMessage());
                }
            }
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    System.out.println(e.getMessage());
                }
            }
    
        }

    使用C3p0,连接数据库成功。并查询数据成功。

  • 相关阅读:
    SQL生成上百万条数据 及分页 长沙
    aspx或ashx里面多个方法 进行ajax调用 长沙
    C# IO操作,文件 文件夹 长沙
    Reperter多层嵌套 长沙
    解读WPF中事件
    WPF 神话之Binding对象二
    WPF 神话之Binding对象一
    明白就好
    导出Execl和读取Execl文件
    新加入博客园,嘿嘿
  • 原文地址:https://www.cnblogs.com/TangGe520/p/9052117.html
Copyright © 2011-2022 走看看