zoukankan      html  css  js  c++  java
  • hibernate 3.* C3P0配置 以及为什么需要连接池!

    Hibernate自带的连接池算法相当不成熟。 它只是为了让你快些上手,并不适合用于产品系统或性能测试中。 出于最佳性能和稳定性考虑你应该使用第三方的连接池。只需要用特定连接池的设置替换 hibernate.connection.pool_size即可。这将关闭Hibernate自带的连接池。 例如, 你可能会想用C3P0.
            C3P0是一个随Hibernate一同分发的开源的JDBC连接池, 它位于lib目录下。 如果你设置了hibernate.c3p0.*相关的属性, Hibernate将使用 C3P0ConnectionProvider来缓存JDBC连接。 如果你更原意使用Proxool, 请参考发 行包中的hibernate.properties并到Hibernate网站获取更多的信息。

            这是一个使用C3P0的hibernate.properties样例文件(来自Hibernate包中etc目录下):

    ###########################
    ### C3P0 Connection Pool###
    ###########################

    #hibernate.c3p0.max_size 2
    #hibernate.c3p0.min_size 2
    #hibernate.c3p0.timeout 5000
    #hibernate.c3p0.max_statements 100
    #hibernate.c3p0.idle_test_period 3000
    #hibernate.c3p0.acquire_increment 2
    #hibernate.c3p0.validate false
     


            在hibernate.cfg.xml文件里面加入如下的配置:

            <!-- 最大连接数 -->
            <property name="hibernate.c3p0.max_size">20</property>

            <!-- 最小连接数 -->
            <property name="hibernate.c3p0.min_size">5</property>

            <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 ***-->
            <property name="hibernate.c3p0.timeout">120</property>

            <!-- 最大的PreparedStatement的数量 -->
            <property name="hibernate.c3p0.max_statements">100</property>

            <!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
            <property name="hibernate.c3p0.idle_test_period">120</property>

            <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
            <property name="hibernate.c3p0.acquire_increment">2</property>

            <!-- 每次都验证连接是否可用 -->
            <property name="hibernate.c3p0.validate">true</property>
     


            完整示例如下(hibernate.properties):

    hibernate.connection.driver_class = org.postgresql.Driver
    hibernate.connection.url = jdbc:postgresql://localhost/mydatabase

    hibernate.connection.username = myuser
    hibernate.connection.password = secret
    hibernate.c3p0.min_size=5
    hibernate.c3p0.max_size=20
    hibernate.c3p0.timeout=1800
    hibernate.c3p0.max_statements=50
    hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

    ====================================

    引言

    java应用开发中经常有程序员讲需要配置数据库连接池,如果不配置连接池,应用在大量用户访问的情况下会发生数据库连接异常,也就是会说连不上数据库,然后如数家珍的列举一大堆连接池组件,比如:dbcp、c2p0、bonecp。。。。,各个都系出名门,都号称具有什么什么优势,更有好事者自己开发一个连接池。那为什么要引入连接池呢?换句话说引入连接池会带来什么好处呢?下面就让我们来分析一下,探测一下谜底。

    [编辑]解密

    [编辑]数据库连接的原理

    数据库连接的本底上都是tcp连接,tcp连接位于osi的4层上,所有的数据库驱动都在7层上实现自己的协议。数据库连接的协议一般都是二进制的协议。应用程序和数据库每建一个数据库其实就是在底层建立了一个tcp线路,tcp线路是有底层的操作系统实现的,每个线路占用两个端口,发送端口和接收端口,这两个端口在数据交换过程中会互换角色,时而发送、时而接收。当web应用连接mysql数据库时,目标的接收端口是3306,连接时3306要被明确的指定,此时web应用方也有一个端口被占用,这个端口不需要被明确的指定,是操作系统自动分配的。操作系统的端口数是有限的,一般缺省可能是1024,不同的操作系统会有所不同,每一个socket也是占用资源的,一般叫socket的资源描述符,这些资源对于操作系统来说也是有限的,linux下通过ulimit命令可以指定更多资源。

    [编辑]连接无法打开原因

    1. 占用端口不释放,每一个socket在调用close后,socket会处于Time_wait状态,处于此状态的socket需要经过一段时间才能释放,这个释放时间随不同的操作系统而不同,socket的不释放导致端口不释放,再次连接时操作系统分配不出端口
    2. socket文件描述符不释放,还是上面的原因,socket资源不释放,操作系统不能分配新的资源

    [编辑]建立连接的资源开销

    java的数据库连接相对来说是重量级的,构建一个连接的系统开销很大,不停的关闭、创建数据库连接对应用系统来说开销太大

    [编辑]连接池的应用

    连接池是存储、管理数据库连接的容器,应用程序把获取数据库连接的功能委托给连接池,每个连接池都有一个上限,如果连接池达到上限,应用程序线程申请连接时被堵塞,等待其他线程释放连接,每个线程使用完连接后并不马上关闭,至少把它返还给连接池。由于连接的共享,不会频繁的创建、销毁连接,因此就不会增加创建连接的开销,也不会出现socket释放延迟现象。

    [编辑]其他

    1. jndi连接池是整个web容器持有,容器内所有的应用共享,有可能造成应用之间的竞争
    2. 应用级的连接池,粒度较小,容易控制
    3. hibernate只支持c3p0
  • 相关阅读:
    leetcode: power of three 三种解法
    继续写java和socket
    node中的事件发射器
    谈一谈Crsf和XSS攻击
    谈一谈那些框架们
    【Mysql数据库】学习笔记
    【数据库】DML-增删改查-SQL实现
    【Jsp,Servlet初学总结】 含 cookie和session的使用
    struct和typedef struct彻底明白了
    Android 学习之路
  • 原文地址:https://www.cnblogs.com/kaka-bing/p/3173347.html
Copyright © 2011-2022 走看看