线程池c3p0和dbcp2的配置初始化实例

一、c3p0

public class ConnectionManager {

    public static ComboPooledDataSource dataSource;
    static {
        try {
            dataSource = new ComboPooledDataSource();
            dataSource.setUser("freeswitch");
            dataSource.setPassword("freeswitch");
            dataSource.setJdbcUrl("jdbc:postgresql://数据库地址:数据库端口/freeswitch");
            dataSource.setDriverClass("org.postgresql.Driver");
            dataSource.setInitialPoolSize(10);
            dataSource.setMinPoolSize(5);
            dataSource.setMaxPoolSize(50);
            dataSource.setMaxStatements(100);
            dataSource.setMaxIdleTime(60);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection3() {
        Connection conn = null;
        if (null != dataSource) {
            try {
                conn = dataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return conn;
    }
}

二、dbcp2

public class DataBaseHelper {

    // 保证一个线程一个Connection,线程安全
    private static final ThreadLocal<Connection> connHolder;
    // 线程池
    private static final BasicDataSource dataSource;
    static {
        connHolder = new ThreadLocal<Connection>();
        dataSource = new BasicDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        dataSource.setUrl("jdbc:postgresql://数据库地址:数据库端口/freeswitch");
        dataSource.setUsername("freeswitch");
        dataSource.setPassword("freeswitch");
        /// 设置空闲和借用的连接的最大总数量,同时可以激活。
        dataSource.setMaxTotal(60);
        // 设置初始大小
        dataSource.setInitialSize(5);
        // 最小空闲连接
        dataSource.setMinIdle(8);
        // 最大空闲连接
        dataSource.setMaxIdle(16);
        // 超时等待时间毫秒
        dataSource.setMaxWaitMillis(2 * 10000);
        // 只会发现当前连接失效,再创建一个连接供当前查询使用
        dataSource.setTestOnBorrow(true);
        // removeAbandonedTimeout :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
        dataSource.setRemoveAbandonedTimeout(180);
        // removeAbandoned :超过removeAbandonedTimeout时间后,是否进
        // 行没用连接(废弃)的回收(默认为false,调整为true)
        // DATA_SOURCE.setRemoveAbandonedOnMaintenance(removeAbandonedOnMaintenance);
        dataSource.setRemoveAbandonedOnBorrow(true);
        // testWhileIdle
        dataSource.setTestOnReturn(true);
        // testOnReturn
        dataSource.setTestOnReturn(true);
        // setRemoveAbandonedOnMaintenance
        dataSource.setRemoveAbandonedOnMaintenance(true);
        // 记录日志
        dataSource.setLogAbandoned(true);
        // 设置自动提交
        dataSource.setDefaultAutoCommit(true);

    }

    /**
     * 获取数据库连接
     */
    public static Connection getConnection() {
        Connection conn = connHolder.get();
        if (conn == null) {
            try {
                conn = dataSource.getConnection();
                System.out.println("get connection success");
            } catch (SQLException e) {
                System.out.println("get connection failure:" + e);
            } finally {
                connHolder.set(conn);
            }
        }
        return conn;
    }

    /**
     * 关闭数据库连接
     */
    public static void closeConnection() {
        Connection conn = connHolder.get();
        if (conn != null) {
            try {
                conn.close();
                System.out.println("close connection success");
            } catch (SQLException e) {
                System.out.println("close connection failure:" + e);
                throw new RuntimeException(e);
            } finally {
                connHolder.remove();
            }
        }
    }

}
时间: 2024-10-15 06:13:36

线程池c3p0和dbcp2的配置初始化实例的相关文章

tomcat JDBC连接池c3p0连接资源耗尽导致tomcat实例对应的app移动端无法访问。

tomcat app手机端程序无法打开了. 直接查看tomcat日志: [[email protected] logs]$ tail catalina.out          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)         at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(Task

nginx线程池源码解析

周末看了nginx线程池部分的代码,顺手照抄了一遍,写成了自己的版本.实现上某些地方还是有差异的,不过基本结构全部摘抄. 在这里分享一下.如果你看懂了我的版本,也就证明你看懂了nginx的线程池. 本文只列出了关键数据结构和API,重在理解nginx线程池设计思路.完整代码在最后的链接里. 1.任务节点 typedef void (*CB_FUN)(void *); //任务结构体 typedef struct task { void *argv; //任务函数的参数(任务执行结束前,要保证参数

从源代码分析Universal-Image-Loader中的线程池

一般来讲一个网络访问就需要App创建一个线程来执行,但是这也导致了当网络访问比较多的情况下,线程的数目可能积聚增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可能导致系统OOM.在UIL中引入了线程池这种技术来管理线程.合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,

java多线程详解(7)-线程池的使用

在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, 这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 这个是时候我们需要使用线程池技术创建多线程. 本文目录大纲: 一.Java中的ThreadPoolExecutor类 二.深入剖析线程池实现原理 三.使用示例 四.如何合理配置线程池的大小 一.Java中的ThreadPoolExecutor类 jav

不惑JAVA之JAVA基础 - 线程池

简单原理 一个比较简单的线程池至少应包含线程池管理器.工作线程.任务队列.任务接口等部分. 线程池管理器(ThreadPool Manager)的作用是创建.销毁并管理线程池,将工作线程放入线程池中: 工作线程是一个可以循环执行任务的线程,在没有任务时进行等待: 任务队列的作用是提供一种缓冲机制,将没有处理的任务放在任务队列中: 任务接口是每个任务必须实现的接口,主要用来规定任务的入口.任务执行完后的收尾工作.任务的执行状态等,工作线程通过该接口调度任务的执行. 线程池的优点 降低资源消耗,通过

java并发包&amp;线程池原理分析&amp;锁的深度化

      java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制.移动.代价比较高.因此,它适合随机查找和遍历,不适合插入和删除. 2.Vector与Arra

Java线程池应用

Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待.如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要).在某个线程被显式地关闭之前,池中的线程将一直存在. 创建一个固定大小的线程池来执

《Java并发编程实战》----(八)线程池的使用

1,线程饥饿死锁 在线程池中,如果任务依赖于其他任务,那么可能产生死锁.在单线程的Executor中,如果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交任务的结果,那么通常会引发死锁.第二个任务停留在工作队列中,等待第一个任务完成,而第一个任务又无法完成,因为它在等待第二个任务的完成.在更大的线程池中,如果所有正在执行任务的线程都由于等待其他仍处于工作队列中的任务而阻塞,也会发生统一的问题.这种现象叫做线程饥饿死锁(Thread Starvation Deadlock),只

Android-Universal-Image-Loader 学习笔记(五)线程池分析

UniveralImageLoader中的线程池 一般情况网络访问就需要App创建一个线程来执行(不然可能出现很臭的ANR),但是这也导致了当网络访问比较多的情况下,线程的数目可能指数增多,虽然Android系统理论上说可以创建无数个线程,但是某一时间段,线程数的急剧增加可能导致系统OOM. 在UIL中引入了线程池这种技术来管理线程.合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线