zoukankan      html  css  js  c++  java
  • paip.提升性能数据库连接池以及线程池以及对象池

    paip.提升性能----数据库连接池以及线程池以及对象池

    目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池

    作者Attilax  艾龙,  EMAIL:1466519819@qq.com
    来源:attilax的专栏
    地址:http://blog.csdn.net/attilax

    //为什么要使用数据库连接池
    建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。
    对于共享资源,有一个很著名的设计模式:资源池 (Resource Pool)。

    /连接池主要工作模式




    3. 当连接池中的连接都已经用完,而有新的连接请求到来时会发生什么?
    当连接池已经达到它的最大连接数目时,有新的连接请求到来时,新的连接请求将放置到连接队列中。当有连接释放给连接池时,连接池将新释放的连接分配给在队列中排队的连接请求。你可以调用close和dispose将连接归还给连接池。
    4. 我应该如何允许连接池?
    对于.NET应用程序而言,默认为允许连接池。(这意味着你可以不必为这件事情做任何的事情)当然,如果你可以在SQLConnection对象的连接字符串中加进Pooling=true;确保你的应用程序允许连接池的使用。
    5. 我应该如何禁止连接池?
    ADO.NET默认为允许数据库连接池,如果你希望禁止连接池,可以使用如下的方式:
    1) 使用SQLConnection对象时,往连接字符串加入如下内容:Pooling=False;
    2) 使用OLEDBConnection对象时,往连接字符串加入如下内容:OLE DB Services=-4;

    当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列


    ///Java连接池
    在Java中开源的数据库连接池有以下几种 :
    1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate[1]一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
    2,Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
    3,Jakarta DBCP DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用。



    11,Druid,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
    支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
    Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。
    Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。
    简单SQL语句用时10微秒以内,复杂SQL用时30微秒。
    通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的

    线程池
    Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。下面这张图完整描述了线程池的类体系结构。
    标记一下比较重要的类:
    ExecutorService:     真正的线程池接口。
    ScheduledExecutorService     能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。
    ThreadPoolExecutor     ExecutorService的默认实现。
    ScheduledThreadPoolExecutor     继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

    要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

        newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
        newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
        newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
        newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
        newSingleThreadExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

    //对象池
    Jakartacommons-pool对象池
        
        
    参考:
    数据库连接池C3P0学习 - haoran-10 - ITeye技术网站.htm
    c3p0使用数据库连接池示例_newflyaaa的空间_百度空间.htm
  • 相关阅读:
    [CVPR2017]Online Video Object Segmentation via Convolutional Trident Network
    [CVPR2018]Context-aware Deep Feature Compression for High-speed Visual Tracking
    光栅图形学(二):圆弧的扫描转换算法
    光栅图形学(一):直线段的扫描转换算法
    Vector使用
    STL源码剖析 — 空间配置器(allocator)
    C++ traits技术浅谈
    OpenCv 2.4.9 (二) 核心函数
    vs2017 android demo
    asp.net webapi 自托管插件式服务
  • 原文地址:https://www.cnblogs.com/attilax/p/15199396.html
Copyright © 2011-2022 走看看