(转)数据库连接池的理解和使用

一、什么是数据库连接池?

官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申

请,使用,释放。

个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们

集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

二、数据库连接池的运行机制

(1) 程序初始化时创建连接池

(2) 使用时向连接池申请可用连接

(3) 使用完毕,将连接返还给连接池

(4) 程序退出时,断开所有连接,并释放资源

三、数据库连接池的使用

作为开源的数据库连接池,C3P0是一个优秀的连接池,性能也十分可靠。首先到http://sourceforge.net/projects/c3p0/下载相应的jar包,总共三个,

如下图所示。

其次将jar包导入到工程当中,然后就可以使用cp30了。

示例代码如下:

    package com.zww.server;  

    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import com.mchange.v2.c3p0.ComboPooledDataSource;  

    public final class ConnectionManager {
        //使用单利模式创建数据库连接池
        private static ConnectionManager instance;
        private static ComboPooledDataSource dataSource;  

        private ConnectionManager() throws SQLException, PropertyVetoException {
            dataSource = new ComboPooledDataSource();  

            dataSource.setUser("root");     //用户名
            dataSource.setPassword("123456"); //密码
            dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zww");//数据库地址
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setInitialPoolSize(5); //初始化连接数
            dataSource.setMinPoolSize(1);//最小连接数
            dataSource.setMaxPoolSize(10);//最大连接数
            dataSource.setMaxStatements(50);//最长等待时间
            dataSource.setMaxIdleTime(60);//最大空闲时间,单位毫秒
        }  

        public static final ConnectionManager getInstance() {
            if (instance == null) {
                try {
                    instance = new ConnectionManager();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return instance;
        }  

        public synchronized final Connection getConnection() {
            Connection conn = null;
            try {
                conn = dataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
    }

下面是测试代码:

    package com.zww.server;  

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;  

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;  

    public class ConnectionDemo {  

        public static void main(String[] args) throws SQLException {
            System.out.println("使用连接池................................");
            for (int i = 0; i < 20; i++) {
                long beginTime = System.currentTimeMillis();
                Connection conn = ConnectionManager.getInstance().getConnection();
                try {
                    PreparedStatement pstmt = conn.prepareStatement("select * from event");
                    ResultSet rs = pstmt.executeQuery();
                    while (rs.next()) {
                         // do nothing...
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }  

                long endTime = System.currentTimeMillis();
                System.out.println("第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));
            }  

            System.out.println("不使用连接池................................");
            for (int i = 0; i < 20; i++) {
                long beginTime = System.currentTimeMillis();
                MysqlDataSource mds = new MysqlDataSource();
                mds.setURL("jdbc:mysql://localhost:3306/zww");
                mds.setUser("root");
                mds.setPassword("123456");
                Connection conn = mds.getConnection();
                try {
                    PreparedStatement pstmt = conn.prepareStatement("select * from event");
                    ResultSet rs = pstmt.executeQuery();
                    while (rs.next()) {
                                        // do nothing...
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                long endTime = System.currentTimeMillis();
                System.out.println("第" + (i + 1) + "次执行花费时间为:"
                                    + (endTime - beginTime));
            }  

        }

运行结果如下图所示:

测试结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

转自:http://blog.csdn.net/wenwen091100304/article/details/48035003

时间: 2024-10-17 04:06:02

(转)数据库连接池的理解和使用的相关文章

对数据库连接池的理解

对数据库连接池的理解: java操作数据库需要使用JDBC来进行操作,每次操作需要获取和数据库的一个连接,并在连接中进行操作. 但是,频繁的打开链接,关闭连接势必对系统性能造成消耗.所以,把获取连接与对连接的管理完全交给第三方数据库连接池这个中间件,当系统启动时,会按照javaee标准,对其中配置的数据库连接池进行初始化并在内存中保持几个连接.系统在使用这些连接时不需要关注这些连接的打开和关闭,只需要同数据库连接池获取连接进行操作即可,而其他的所有和数据库直接交互的操作都交给数据库连接池去做.

数据库连接池的理解和使用

一.什么是数据库连接池? 官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放. 个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患.所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠. 二.数据库连接池的运行机制 (1) 程序初始化时创建连接池 (2) 使用时向连接池申请可用连接 (3) 使

对spring 对持久层的支持和数据库连接池的理解

1.spring对持久层的支持在于,得到数据库连接之后操作上的封装,将操作简化了.也就是说以后操作sql语句就用XXXTemplate对象了. 2.数据库连接池的作用只在于得到数据库的连接,并对数据库的连接做管理,不涉及到得到连接后的操 所以,spring对持久层的支持的XXXTemplate类是属于spring包下的,是spring的支持.但是数据库连接池的获取连接的数据源对象XXXDataSource对象是在第三方包内的,比如c3p0和dbcp包 3.所以不同的XXXTemplate可以和不

数据库连接池和connection的理解

数据库连接池Data Source Pool的理解 1.数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个连接,避免了每个方法里new connection的耗费资源和时间. 2.数据库连接池是在项目启动时候初始化的,以方便程序运行时,随时可以调用这些已经被创建好的connection.只需要getConnection()就好. connection的建立.断开都由连接池自身来管理. 3.创建connection是个很耗时的操作,所以建议在项目启动的时候去创建connec

java jdbc深入理解(connection与threadlocal与数据库连接池和事务实)

1.jdbc连接数据库,就这样子 Class.forName("com.mysql.jdbc.Driver"); java.sql.Connection conn = DriverManager.getConnection(jdbcUrl); 2.通过传入jdbc url用Drivermanager.getConnection(jdbcurl)连接数据库, 注意:一次Drivermanager.getConnection(jdbcurl)获得只是一个connection,并不能满足高并

理解数据库连接池底层原理之手写实现

第一,数据库连接池中存放的就是数据库操作管道,不仅仅是存放,而且应该是管理这些管道: 第二,应该提供外部配置文件去初始化数据库连接池: 第三,如果一个数据库操作管道已经被占用,那么其他请求是否应该得到这个管道,也就是说我们要考虑多线程并发下,管道的分配问题: 第四,如果做到管道的复用?放回池子中,标示可用,并不是真正的关闭管道: IMyPool是一个接口,对外提供数据库连接池的基本服务,比如得到一个数据库操作管道. MyDefaultPool是IMyPool的实现. MyPooledConnec

几种常见数据库连接池的使用比较

感觉在介绍之前有必要阐述一下连接池的几个概念,有助于后边一些文字的理解. 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题.由此使用连接池的作用就显现出来,他的原理其实不复杂:先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是准备给下一个调用者进行分配.由此可以看出连接池节省了大量的数据库

Tomcat6.0数据库连接池配置

http://blog.163.com/magicc_love/blog/static/185853662201111101130969/ oracle驱动包Tomcat 6.0配置oracle数据库连接池 安装Tomcat后,在我的电脑-属性—>高级-->环境变量系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat); CATALINA_HOME: c:\tomcat CATALINA_BASE: c:\tomcat TOMCAT_HOME: c:\tomcat 然后修改

01_数据库连接池,数据源,ResultSetMetaData,jdbc优化

 一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.宕机. 解决方案就是数据库连接池 连接池就是数据库连接对象的一个缓冲池 我们可以先创建10个数