精华内容
下载资源
问答
  • 数据库连接池有哪些
    万次阅读 多人点赞
    2020-07-23 17:51:04

    一、什么是连接池?

    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

    释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

    ———以上参考《百度百科》

    二、为什么使用数据连接池

    建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。

    连接池就是这样一个容器:它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。

    三、数据库连接池的工作原理

    连接池的工作原理主要由三部分组成,分别为

    • 连接池的建立
    • 连接池中连接的使用管理
    • 连接池的关闭

    第一、连接池的建立。
      一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。

    Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。

    第二、连接池的管理。
      连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:

    当客户请求数据库连接时,

    • 1)如果池中有空闲连接可用,返回该连接。
    • 2)如果没有空闲连接,池中连接都已用完,创建一个新连接添加到池中。
    • 3)如果池中连接已达到最大连接数,请求按设定的最大等待时间进入等待队列直到有空闲连接可用。
    • 4)如果超出最大等待时间,则抛出异常给客户。

    当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。

    该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

    如果连接长时间空闲,或检测到与服务器的连接已断开,连接池管理器也会将该连接从池中移除。

    第三、连接池的关闭。
    当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

    四、连接池需要注意的点

    1、并发问题

    为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。

    这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支持像java,c#等等,使用synchronized(java)lock(C#)关键字即可确保线程是同步的。

    2、事务处理

    我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。

    我们知道当2个线程共用一个连接Connection对象,而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题,因为即使Connection类提供了相应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进行事务操作而引起的。

    为此我们可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。

    3、连接池的分配与释放

    连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。

    对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他,如果没有就抛出一个异常给用户。

    4、连接池的配置与维护

    连接池中到底应该放置多少连接,才能使系统的性能最佳?

    系统可采取设置**最小连接数(minConnection)最大连接数(maxConnection)**等参数来控制连接池中的连接。

    比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。

    最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。

    如何确保连接池中的最小连接数呢?

    有动态和静态两种策略。
    动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。

    更多相关内容
  • mysql数据库连接池工具类,mysql数据库连接池工具类.......
  • 达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,
  • System.out.println("数据库连接池jar包,数据库连接驱动"); System.out.println("数据库连接池jar包,数据库连接驱动"); System.out.println("数据库连接池jar包,数据库连接驱动");
  • JAVA 使用数据库连接池连接Oracle数据库,全代码,附加详细说明
  • delphi 实现数据库连接池,可以初始化连接池中数据库连接个数,动态创建新连接,及多线程互斥获取资源。
  • 最新版druid 数据库连接池 druid-1.1.9.zip
  • (10)常见的几种数据库连接池的配置和使用

    万次阅读 多人点赞 2020-03-17 15:59:04
    今天主要介绍几款常见的数据库连接池 并且对它们的使用做一个总结,本篇文章是以SpringBoot 项目为例,一起随着小编看一下吧! 在文章的开始,提出一个问题: 一.为什么要使用数据库连接池? 影响一个系统使用...

     今天主要介绍几款常见的数据库连接池 并且对它们的使用做一个总结,本篇文章是以SpringBoot 项目为例,一起随着小编看一下吧!

    在文章的开始,提出一个问题:

    一.为什么要使用数据库连接池?

    影响一个系统使用感受的因素是方方面面的,比如 电脑配置,业务逻辑代码写的低效率,又或者数据渲染过慢,其中都是以数据为一个中间点,提到数据必然会想到数据库。

    试想一下,用户的每一次访问,我们都创建一个连接,用完后就关闭它,使用频率不高的这样也是能够接受的,但是对于一个运行系统来说是有点负担的,因为运行系统对数据的操作比较频繁,频繁开启,关闭 数据库连接,会极大的降低系统的性能,从而引发一些潜在的问题。

    数据库连接池是什么?

    数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回的方法。

    这样做的好处:

    连接复用【数据库连接池提供了一套高效的连接分配.使用策略. 最终实现连接的高效】

    更快的响应速度

    统一的连接管理,避免数据库连接泄露

    连接池的工作原理:

    引自:戳这里

    连接池的参数:

    二.JDBC 数据库连接池

    最开始学习Java 的时候,那个时候还没用连接池,用的是JDBC ,已经好久没有写过这些代码了,随着小编一起回顾一下知识吧

    数据库表结构:

     

    package com.test.nodefault;
    
    import java.sql.*;
    
    /**
     * @Author tanghh
     * @Date 2020/3/17 14:49
     * 数据库Jdbc 的连接
     */
    public class JdbcTest {
        public static void main(String[] args) {
            String userName = "root";
            String password = "root";
            String url = "jdbc:mysql://192.168.20.81:3306/main_config";
            String sql = "select * from linkman";
            try {
                //1.加载Jdbc 的驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2.提供jdbc连接的url,创建数据库的连接。
                Connection connection = DriverManager.getConnection(url, userName, password);
                //3. 创建Statement
                PreparedStatement preparedStatement = connection.prepareStatement(sql);
                //4.执行sql 语句
                ResultSet rs = preparedStatement.executeQuery();
                //5.处理结果
                while (rs.next()) {
                    System.out.println("id : " + rs.getInt(1) + " linkman_name : " + rs.getString(2) );
                }
                //6.使用完连接对象以后,记得关闭流
                // 关闭记录集
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                // 关闭声明
                if (preparedStatement != null) {
                    try {
                        preparedStatement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                // 关闭连接对象
                if (connection != null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    效果如下:

    三.几大数据库连接池比较

    测试性能这块不在本篇文章的讨论范围之内,先总结一下几大连接池的区别

    c3p0

     在小编学习ssm 框架的时候,我们使用的就是c3p0,  优点是功能简单易用,稳定性好。 缺点就是性能差,由于其架构设计过于复杂,重构成了一件很难的事,因此性能上的缺点,让它失去了大多数用户的使用。

    dbcp

    DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目。

     DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的。这个我没怎么用过,不做过多展开,用兴趣的可以去了解一下。

    HikariCP

     HikariCP号称“性能杀手”  ,具体可参考:戳这

    Druid

    中文文档比较齐全,它的优点在于强大的监控功能,可以清楚的知道 连接池和SQL的工作情况,方便扩展。

    对这几个测试总结:

    性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 

    uid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性

    综合以上我们目前系统用的是阿里巴巴的数据库连接池 druid

    测试文章

    四.阿里巴巴数据库连接池

    (1)首先在pom 文件中引入Jar 包

        <!-- druid连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>

     在配置参数的类中加入一些参数:

    # 下面为连接池的补充设置,应用到上面所有数据源中
    # 初始化大小,最小,最大
    spring.datasource.initialSize=5
    spring.datasource.minIdle=5
    spring.datasource.maxActive=50
    # 配置获取连接等待超时的时间
    spring.datasource.maxWait=60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    spring.datasource.timeBetweenEvictionRunsMillis=60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    spring.datasource.minEvictableIdleTimeMillis=300000
    #spring.datasource.validationQuery=SELECT 1 FROM DUAL
    spring.datasource.testWhileIdle=true
    spring.datasource.testOnBorrow=false
    spring.datasource.testOnReturn=false
    # 打开PSCache,并且指定每个连接上PSCache的大小
    spring.datasource.poolPreparedStatements=true
    spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    spring.datasource.filters=stat,wall,log4j
    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    # 合并多个DruidDataSource的监控数据
    spring.datasource.useGlobalDataSourceStat=true

     

    package com.bos.util;
     
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
     
    @Configuration
    public class DruidConfiguration {
        @Bean
        public ServletRegistrationBean statViewServlet(){
            //创建servlet注册实体
            ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
            //设置ip白名单
            servletRegistrationBean.addInitParameter("allow","127.0.0.1");
            //设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
            servletRegistrationBean.addInitParameter("deny","192.168.0.19");
            //设置控制台管理用户
            servletRegistrationBean.addInitParameter("loginUsername","root");
            servletRegistrationBean.addInitParameter("loginPassword","123123");
            //是否可以重置数据
            servletRegistrationBean.addInitParameter("resetEnable","false");
            return servletRegistrationBean;
        }
     
        @Bean
        public FilterRegistrationBean statFilter(){
            //创建过滤器
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
            //设置过滤器过滤路径
            filterRegistrationBean.addUrlPatterns("/*");
            //忽略过滤的形式
            filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            return filterRegistrationBean;
        }
    }

     

    在浏览器上访问:

    五.参考文章:

    Springboot+druid数据库连接池使用

    数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)

    以上只是小编的一点小总结,等了解的比较深刻以后再不断完善,如果您觉得写得不错的话,不妨给小编一个免费的赞吧!

    展开全文
  • java中几个主流的数据库连接池

    万次阅读 多人点赞 2018-08-12 19:12:03
    这里所说的池是一种广义上的池,比如数据库连接池、线程池、内存池、对象池等。其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象。需要时直接从池中取出一个空闲对象,用完后并不直接释放掉...

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销。这里所说的池是一种广义上的池,比如数据库连接池、线程池、内存池、对象池等。其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象。需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用。其他几种池的设计思想也是如此,池技术的优势是,可以消除对象创建所带来的延迟,从而提高系统的性能。

    要了解Java连接池我们先要了解数据库连接池(connection pool)的原理,Java连接池正是数据库连接池在Java上的应用。——我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。

    该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

     

    C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。(主页:http://sourceforge.net/projects/c3p0/)

     

    BoneCP 是一个开源的快速的 JDBC 连接池。BoneCP很小,只有四十几K(运行时需要log4j和Google Collections的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。另外个人觉得 BoneCP 有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是 BoneCP 优秀的原因,BoneCP 到底有什么突出的地方呢,请看看性能测试报告。(主页:http://jolbox.com/)

     

    DBCP (Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。(主页:http://commons.apache.org/dbcp/)

     

    Proxool是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。

     

     

    数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

    Java中常用的数据库连接池有:DBCP 、C3P0、BoneCP、Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager及Druid等。

    Java开源数据连接池: http://www.open-open.com/20.htm

    Hibernate常用三种连接池的配置:http://tieba.baidu.com/f?kz=70604644

     

    几种常用java连接池:http://hi.baidu.com/tangyudee/blog/item/f8bdb43decca892571cf6ced.html

    感觉在介绍之前有必要阐述一下连接池的几个概念,有助于后边一些文字的理解。
    最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源。由于频繁的打开和关闭连接对jvm包括数据库
    都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题。由此使用连接池的作用就显现出来,他的原理其实不复杂:
    先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是
    准备给下一个调用者进行分配。由此可以看出连接池节省了大量的数据库连接打开和关闭的动作,对系统性能提升的益处不言而喻。
    几个概念:
    最小连接--应用启动后随即打开的连接数以及后续最小维持的连接数。
    最大连接数--应用能够使用的最多的连接数
    连接增长数--应用每次新打开的连接个数
    举个例子说明连接池的运作:
    假设设置了最小和最大的连接为10,20,那么应用一旦启动则首先打开10个数据库连接,但注意此时数据库连接池的正在使用数字为0--因为你并没有使用这些连接,而空闲的数量则是10。然后你开始登录,假设登录代码使用了一个连接进行查询,那么此时数据库连接池的正在使用数字为1、空闲数为9,这并不需要从数据库打开连接--因为连接池已经准备好了10个给你留着呢。登录结束了,当前连接池的连接数量是多少?当然是0,因为那个连接随着事务的结束已经返还给连接池了。然后同时有11个人在同一秒进行登录,会发生什么:连接池从数据库新申请(打开)了一个连接,连同另外的10个一并送出,这个瞬间连接池的使用数是11个,不过没关系正常情况下过一会儿又会变成0。如果同时有21个人登录呢?那第21个人就只能等前面的某个人登录完毕后释放连接给他。这时连接池开启了20个数据库连接--虽然很可能正在使用数量的已经降为0,那么20个连接会一直保持吗?当然不,连接池会在一定时间内关闭一定量的连接还给数据库,在这个例子里数字是20-10=10,因为只需要保持最小连接数就好了,而这个时间周期也是连接池里配置的。

    好了,基本概念说完了,言归正传进行比较了。
    首先说明的一点,为了应用便于移植以及可配置的角度,建议还是使用jndi统一进行连接池的配置。怎么配置其实网上都有很多例子,
    这里简单举个例子(使用spring框架):
    首先在应用的上下文定义中配置jndi名称,如一个resource.xml文件,里边的写法
        <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName"><value>jdbc/myapp</value></property>
        </bean>
    注意dataSource这个bean在dao层(hibernate或jdbc)的配置文件里需要作为dataSource名称的属性配置到所有bean中
    其中“jdbc/myds”这个就是jndi名称了,下一步就是在应用服务器连接池里进行数据库连接以及对应的jndi配置了

    一 开源数据连接池
    1 dbcp
    dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
    这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
    使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
    有所下降,此外不提供连接池监控

    2 c3p0
    c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
    这个连接池的配置参见附件压缩包中的:c3p0.xml。
    使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,
              此外不提供连接池监控。
             
    3 proxool
    proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
    这个连接池的配置参见附件压缩包中的:proxool.xml。
    使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码
    在另外2个开源连接池中成功结束,但在proxool中出现异常退出。
    但是proxool有一个优势--连接池监控,这是个很诱人的东西,大概的配置方式就是在web.xml中添加如下定义:
        <servlet>
            <servlet-name>admin</servlet-name>
            <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>     
       </servlet>
       <servlet-mapping>
          <servlet-name>admin</servlet-name>
          <url-pattern>/admin</url-pattern>
       </servlet-mapping>  
    并在应用启动后访问:http://localhost:8080/myapp/admin这个url即可监控
    不过proxool本身的包在监测使用中会有编码问题,附件中有一个
    解决此问题的包,参见附件压缩包中的:proxool-0.9.0RC3.jar。另外需要jdk1.5以上的环境。

    总结时刻:
    综上所述,这几种开源连接池各有优劣,推荐使用c3p0,经检验这种连接池性能稳定,承压能力强。而proxool尽管有明显的性能问题,
    但由于它具备监控功能,因此建议在开发测试时使用,有助于确定是否有连接没有被关掉,可以排除一些代码的性能问题。

    二 商业中间件连接池
    上面列举了几种开源的连接池,其实可以肯定的说,如果条件允许使用weblogic和websphere等中间件,那么不要犹豫,一定要
    使用这些商业级别的中间件所自带的数据库连接池,他们的性能以及调配和开源的不在一个量级,举个例子,曾经有一个项目,数据量比较大,同样的代码应用,在3种开源的连接池里都多少出现过系统异常,而weblogic和websphere的连接池则正常运行,当然后来发现代码有一定瑕疵,但也侧面说明了商业连接池的强大。

    1 weblogic的连接池
    weblogic 8 是一个让人使用起来很轻松方便的应用服务器软件,但是到了9简直就是折磨,不知道是bea是怎么想的,oracle收购了bea以后出了10,比9强不少,但是最喜欢的还是8。。。
    题外话不说了,就以8.1版本介绍一下他的数据库连接池(其实10的配置也差不多)
    首先是连接池的基本设置,这个不讲了,网上有很多教程。然后进入Data Sources菜单配置数据源里边的JNDI Name,要和之前在应用配置中的一致:jdbc/myapp。
    然后是连接池一些具体项目的配置,包括设置最小(Initial Capacity),最大( Maximum Capacity)连接,以及
    每次连接增加时需要一次性增加多少连接(Capacity Increment)。Allow Shrinking(是否把不用的连接退还数据库以保持最小连接数--这个就可以参见之前的连接池阐述的例子进行理解了)。
    另外还有几个有意思的选项Test Reserved Connections:对取得的连接进行测试,Test Released Connections:对释放的连接进行测试。有人会问了,这个有什么用啊?
    不知道大家在项目中有没有遇到java报连接失效的异常,反正我碰到过,只有在系统压力大的时候才出现。而有了这个选项就不用担心这个问题了--因为连接池已经帮你测试了,一旦检查到连接是无效的他会废弃掉还给数据库,只给你有效的。不过这个连接失效的异常其实多半是应用的不严谨造成的,我们更因该关心应代码的问题--但起码weblogic想到帮你弥补一下,是不是很贴心:)
    另外一个重要功能当然是连接池监控:monitor选项卡里可以看到使用情况,有人又要问了,没有什么指标啊,别忘了custom view这个功能链接哦:)
    有以下指标:当前连接数、曾经达到的峰值、可以使用的连接数、等待的连接数、从数据库打开的连接数、曾经关闭的连接数。。。其中前3项是我最关注的

    使用评价:在具体项目应用中,此连接池的持续运行的稳定性很强,在大并发量的压力下性能也相当优秀,另外在一些异常情况下连接池里的连接也能够及时释放。
              连接池监控一目了然,及时到位。        

    2 websphere的连接池
    还是先来段题外话:记得有人说过,websphere只有版本6以后才算是websphere,个人很赞同。websphere 5以及以前的版本。。。还是忘了吧。
    其实websphere的连接池秉承ibm一贯的风格:功能强大,使用复杂:)
    进入控制台使用“JDBC提供程序”功能菜单进行连接池的基本配置,一路下来,不同的数据库配置方式不尽相同,最奇怪的是还要单独手工加上user和password参数,如果没有
    资料指导的话还真是摸不着头脑。这些基本设置还是网上找吧很多的。连接池设置完还需要设置数据源,jndi名字一样与之前的对应:jdbc/myapp
    高级设置包括初始化连接数,最大连接,连接有效性检查,不使用超时。。其实这些都和weblogic中的连接池配置大致一样。
    连接池监控:使用运行监控菜单,里边会有一个监控项目选择,选jdbc监控即可,可恶的是一开始弹出什么服务器操作系统需要安装什么图形化控件,选择是那么就得去找到控件在操作系统(linux)下安装,然后很多的依赖组件都没有。。。搞了半天才发现选择否,监控数据以及图形一样能出来嘛,真是要怒了。
    虽然经过一番波折但是监控的内容还是很强大的,就连接池来说一样包括当前连接数、曾经达到的峰值、可以使用的连接数、从数据库打开的连接数、曾经关闭的连接数。。。其中前3项是我最关注的,比较奇怪的现象是应用刚启动的时候已开启的连接数量竟然没有达到初始定义的连接数量,不清楚websphere是怎么个计算机制。
    另外在压力大的时候可使用的连接数会是负数,当时很奇怪,想想也了然了,那个负数肯定是排队等待的数量了

    使用评价:在具体项目应用中,此连接池的持续运行的稳定性相当强,在大并发量的压力下性能也足够优秀,另外在一些异常情况下连接池里的连接能够及时释放,
              连接池监控配置有些复杂,但是配置好后各项指标一目了然并且有图形显示 

     

    • Druid 连接池简介

    Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

    同时Druid不仅仅是一个数据库连接池,它包括四个部分:

        Druid是一个JDBC组件,它包括三个部分:

        基于Filter-Chain模式的插件体系。

        DruidDataSource 高效可管理的数据库连接池。

        SQLParser

    Druid的功能

    1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

    2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。

    3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。

    4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

    5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

    • 使用原因

                 原先项目使用的是C3P0连接池,在项目发布使用一段时间后发现c3p0 连接池访问数据库的时候创建连接会在oralce的lisenter.log 日志文件记录。 

    经过一段时间观察发现oralce每6秒会在lisenter.log日志记录一次,我们设置的最小连接是20,所以oracle每次会在日志记录20条。随着时间越长日志文件越来越大,当日志文件达到4个G的时候会导致oracle死掉。 经过不断调整参数配置还是无法得到解决方案,最后选择使用阿里Druid连接池试试,Druid默认最小连接2个,配置好后发布观察日志发现只在创建的时候在日志里面记录了2条记录。没有像C3P0那样每6秒记录一次导致日志文件越来越大。 

    lisenter.log 日志截图

     

    • Druid使用

           1. Druid.jar包

                           druid-1.1.4.jar   1.1.4

           2.Druid连接池配置

                         

               这里没有配置最小连接数 ,默认为2个。

            3.Druid属性配置图

    配置缺省值
    说明
    name 配置这个属性的意义在于,如果存在多个数据源,监控的时候 
    可以通过名字来区分开来。如果没有配置,将会生成一个名字, 
    格式是:"DataSource-" + System.identityHashCode(this)
    jdbcUrl 连接数据库的url,不同数据库不一样。例如: 
    mysql : jdbc:mysql://10.20.153.104:3306/druid2  
    oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
    username 连接数据库的用户名
    password 连接数据库的密码。如果你不希望密码直接写在配置文件中, 
    可以使用ConfigFilter。详细看这里: 
    https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
    driverClassName根据url自动识别这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
    initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
    maxActive8最大连接池数量
    maxIdle8已经不再使用,配置了也没效果
    minIdle 最小连接池数量
    maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
    poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。 
    PSCache对支持游标的数据库性能提升巨大,比如说oracle。 
    在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
    作者在5.5版本中使用PSCache,通过监控界面发现PSCache有缓存命中率记录, 
    该应该是支持PSCache。
    maxOpenPreparedStatements-1要启用PSCache,必须配置大于0,当大于0时, 
    poolPreparedStatements自动触发修改为true。 
    在Druid中,不会存在Oracle下PSCache占用内存过多的问题, 
    可以把这个数值配置大一些,比如说100
    validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。 
    如果validationQuery为null,testOnBorrow、testOnReturn、 
    testWhileIdle都不会其作用。
    testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
    testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。 
    申请连接的时候检测,如果空闲时间大于 
    timeBetweenEvictionRunsMillis, 
    执行validationQuery检测连接是否有效。
    timeBetweenEvictionRunsMillis 有两个含义: 
    1) Destroy线程会检测连接的间隔时间 
    2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
    numTestsPerEvictionRun 不再使用,一个DruidDataSource只支持一个EvictionRun
    minEvictableIdleTimeMillis  
    connectionInitSqls 物理连接初始化的时候执行的sql
    exceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接
    filters 属性类型是字符串,通过别名的方式配置扩展插件, 
    常用的插件有: 
    监控统计用的filter:stat  
    日志用的filter:log4j 
    防御sql注入的filter:wall
    proxyFilters 类型是List<com.alibaba.druid.filter.Filter>, 
    如果同时配置了filters和proxyFilters, 
    是组合关系,并非替换关系

       

        4.数据源监控配置

              在项目的web.xml加上以下代码

                                  

    复制代码

     1 <filter>
     2         <filter-name>DruidWebStatFilter</filter-name>
     3         <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
     4         <init-param>
     5             <param-name>exclusions</param-name>
     6             <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
     7         </init-param>
     8     </filter>
     9     <filter-mapping>
    10         <filter-name>DruidWebStatFilter</filter-name>
    11         <url-pattern>/*</url-pattern>
    12     </filter-mapping>
    13     
    14     <servlet>
    15         <servlet-name>DruidStatView</servlet-name>
    16         <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
    17     </servlet>
    18     <servlet-mapping>
    19         <servlet-name>DruidStatView</servlet-name>
    20         <url-pattern>/druid/*</url-pattern>
    21     </servlet-mapping>


             
    总结时刻:
    这两种商业级别的连接池都给我留下深刻印象,功能强大,使用稳定,性能优秀,监控到位。可以说难分伯仲,相对而言weblogic的连接池使用配置和监控配置更简单明了,而websphere的更复杂但选项功能也更多一些。其实这正是对两种应用服务器的使用印象的直接反映,当然总体比较2种应用服务器应该又是另一个话题了,也许在下一期的内容里。。。

    比较了多种连接池的优劣,下面这个话题可能和比较本身没有直接关系,但个人认为应该是更有价值的一些经验分享吧,那就是---这么多指标配置,那些最大和最小连接数以及其他一些必要的配置指标,在一个正式的生产项目中到底应该配置什么值呢?
    其实这个值首先还是要根据具体的项目情况、数据规模以及并发数来制定的(尽管像是套话,但是我们研发人员严谨的作风还是必要的:)。具体而言在中型偏小型的项目--给个数值把,用户数300到3000,数据量100万到1亿---中,建议weblogic设置为最大和最小都是200,websphere最小200最大300,前提是2者设置的最小内存要在1G以上,当然如果条件允许内存越大越好,不过32位机内存1.5G的限制是一定的(64位嘛我愿意设个4G内存过来,速度提升的感觉很爽啊)。这个数字出来以后相信会有不少问题要抛过来,我一一谈一下自己的体验和想法吧
    1 为什么是200或300而不是更高?
    回答:  再分配多了效果也不大了,一个是应用服务器维持这个连接数需要内存支持,刚才说了32位的机器只能支持到1.5G,并且维护大量的连接进行分配使用对cpu也是一个不小的负荷,因此不宜太大。
    2 为什么不小一点?
    回答:   如果太小,那么在上述规模项目的并发量以及数据量上来以后会造成排队现象,系统会变慢,数据库连接会经常打开和关闭,性能上有压力,用户体验也不好。
    3 为什么weblogic最小最大都一样,而websphere不一样
    回答:   其实和分配内存的最小最大值的情况一样,一般都推荐2个值应该一致,都放在内存里就好了嘛。但是ibm官方推荐2个值要有区别---官方说法还是要听的
    4 其他开源连接池的分配方案还没说呢?
    回答: 开源的个人认为到100就可以了,再高他也不会太稳定,当然1G的最小内存是一定要给tomcat分的

    展开全文
  • 数据库连接池

    千次阅读 2022-02-11 16:48:34
    什么是数据库连接池 数据库连接池(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理,由程序动态地对池中的链接进行申请,使用,释放。 为什么使用连接池 资源复用 ...

    什么是数据库连接池

    数据库连接池(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理,由程序动态地对池中的链接进行申请,使用,释放。

    为什么使用连接池

    1. 资源复用

    数据库连接得到复用,避免了频繁的创建、释放连接带来的性能开销,减少内存碎片。

    1. 更快的系统相应速度

    数据库连接池初始化时,已经创建多个数据库连接置于池中备用。此时连接的初始化工作已经完成。对于业务请求而言,直接利用连接池中的可用连接,避免了数据库连接的创建和释放,从而缩减了系统整体响应时间。

    1. 统一的连接管理,避免数据库连接泄露

    数据库连接由连接池统一管理,最后由连接池统一对连接进行析构,防止有连接没有析构,导致资源泄露

    1. 避免多个线程同时使用一个连接

    数据库连接并不是线程安全的,连接池可以防止多个线程同时使用一个连接。

    那可不可以一个线程绑定一个线程呢?

    这样肯定是可以的,但是如果这样的话,代码的耦合性太高。使用连接池的方式,耦合性低,可修改性更好。

    数据库连接的生命周期

    1. TCP三次握手

    2. Mysql认证三次握手

    3. SQL执行

    4. Mysql的关闭

    5. TCP四次挥手

    所以数据库连接一般使用的是长连接,如果每次执行SQL都要新建连接的话,连接和释放的代价太大。

    数据库连接池使用的也是长连接。

    img

    数据库连接池运行机制

    从连接池获取或创建可用连接;

    使用完毕后,把连接返回给连接池;

    在系统关闭前,断开所有连接并释放连接占用的系统资源;

    img

    连接池和线程池的关系

    连接池和线程池的区别

    • 线程池:主动调用任务,当任务队列不为空的时候从队列取任务执行。
    • 连接池:被动被任务使用。当某个任务需要操作数据库时,从连接池中取出一个连接对象,当任务使用完该连接对象后,将该连接对象返还给连接池。

    连接池可以和线程池一起使用,一般连接池连接数量和线程池线程数量一致。

    连接池设计

    连接池CDBPool设计

    构造函数

    img

    初始化

    img

    获取连接

    img

    归还连接

    img

    线程池析构

    img

    析构连接池的时候,需要注意析构的顺序:

    1. 先销毁线程池,确保所有任务都已经执行完退出,已经归还了数据库连接;
    2. 再去销毁连接池

    数据库重连机制

    Mysql和redis

    Mysql重连机制

    设置启用自动重连

    my_bool reconnect = true;

    mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect); // 配合mysql_ping实现自动重连

    检测连接是否正常

    int STDCALL mysql_ping(MYSQL *mysql);

    描述:

    检查与服务端的连接是否正常。连接断开时,如果自动重新连接功能未被禁用,则尝试重新连接服务

    器。该函数可被客户端用来检测闲置许久以后,与服务端的连接是否关闭,如有需要,则重新连接。

    返回值:

    连接正常,返回0;如有错误发生,则返回非0值。返回非0值并不意味着服务器本身关闭掉,也有可能

    是网络原因导致网络不通。

    Redis重连机制

    1. 使用之前检测连接是否可用

    2. 使用过程中出现连接异常则释放异常

    3. 下一次使用该连接的时候如果发现连接不可用则重新初始化

    连接池连接数量设置

    连接数设置成多少比较合适?

    一般经验公式,如果CPU核数是N

    1. 对于计算密集型,连接数和线程数设置成N + 1;
    2. 对于io密集型,设置成 2 * N + 2。
    3. 对于计算+io密集型,可以算一下计算时间占总的任务时间的比例,最后算出单个CPU的饱和线程数量,同个这个来设置线程数和连接数。

    执行同一个任务:

    1. 计算时间,不调用设计io的函数
    2. 计算时间+io时间 = 总的任务时间。

    单个CPU的饱和线程数 = 1 / (计算时间 / 总的任务时间)

    最终线程数 = 单个CPU的饱和线程数 * CPU核数

    上面的这些,仅仅是经验公式,最终还是要根据具体业务结合在一起,经过大量测试,设置适合的参数。

    展开全文
  • C# 数据库连接池

    2018-01-16 08:51:05
    c# 数据库连接池管理类,有效统一管理数据库连接,非常好用,自己项目在用!!!
  • 主流的数据库连接池

    千次阅读 2021-10-28 15:02:57
    1.数据库连接池概述 数据库连接的建立是一种耗时、性能低、代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能。数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中,当程序...
  • 阿里巴巴主流数据库连接池Druid入门

    千次阅读 多人点赞 2022-04-09 09:45:36
    数据库连接池的必要性 (一).传统数据库连接模式的的步骤 1.在主程序中创建连接 2.进行sql操作 3.关闭数据库连接 (二).传统数据库连接模式存在的问题 1.浪费时间:每次连接时都要验证登录和将conn加载到内存...
  • SpringBoot笔记 —— 数据库连接池

    千次阅读 2021-11-12 23:48:48
    首先写一个测试类,来看一下连接池的运行过程 package com.demo.spring.test; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java....
  • Druid数据库连接池

    千次阅读 2022-05-11 19:34:00
    1.数据库连接池简介 数据库连接池是个容器,负责分配、管理数据库连接(Connection)。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有...
  • 数据库连接池——基本原理

    千次阅读 2021-06-09 15:26:06
    数据库连接池——基本原理 1.数据库连接池是什么? 数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。 2.为什么要使用连接池? 数据库连接是一种...
  • MySQL数据库连接池

    千次阅读 2021-11-04 20:07:41
    第一节:数据库连接池 1.为什么使用数据库连接池 回顾:jdbc步骤: 1.加载驱动 2.创建连接 3.sql预编译 (Statement/PreparedStatement ?) 4.执行sql(DQL:executeQuery(), DML:executeUpdate()) 5.关闭连接 在...
  • C#高效数据库连接池源码

    热门讨论 2012-11-20 10:32:30
    C#高效数据库连接池源码
  • python 数据库连接池

    千次阅读 2022-02-22 14:41:30
    python 数据库连接池 因为数据库的连接和关闭比较消耗资源,所以通常创建一个连接池,需要就获取,用完则放回连接池 主要两个模块PooledDB和PersistentDB 1、PooledDB和PersistentDB的使用场景 1-1 PersistentDB...
  • 常用的三种数据库连接池

    千次阅读 2017-12-28 16:11:55
    1.数据库连接池的概念 数据库连接池概述:  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个 应用程序的伸缩性和健壮性,...
  • 测试代码和注释。可以参考,代码并不完美,很多地方可以修改,还望高手指点。
  • SpringBoot-设置数据库连接池

    千次阅读 2022-03-01 16:59:30
    SpringBoot-设置数据库连接池 介绍 功能 dbcp druid c3p0 tomcat-jdbc HikariCP 是否支持PSCache 是 是 是 否 否 监控 jmx jmx/log/http jmx/log jmx jmx 扩展性 弱 好 弱 弱 弱 sql拦截及解析 无 ...
  • 数据库连接池配置

    2021-02-18 14:23:37
    数据库连接池配置 连接池的必要性 数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,可以视作一个存放数据库连接的容器。 数据库连接池采用了资源池设计模式,用于资源...
  • 关于数据库连接池满了的问题详解

    千次阅读 2021-06-21 15:31:46
    关于数据库连接池满了的问题详解。这种问题的根源就是数据库连接数过多,连接没有得到释放,还有锁表的情况。
  • 几种常用的数据库连接池

    千次阅读 2017-08-18 09:07:57
     是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4...
  • 一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。 原理 将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接,后面并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接...
  • druid数据库连接池配置

    千次阅读 2021-12-20 13:07:40
    druid数据库连接池配置

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 388,606
精华内容 155,442
关键字:

数据库连接池有哪些