ETL工具完毕的差点儿相同了。今天遇到一个问题。就是给C3P0配置了maxPoolSize为10。目的是想让整个应用同一时候获得的最大的Connection个数为10,可是在測试应用的这一部分之后,发现PostgreSQL端的链接远远超过10个。由于工具是多线程的。所以就想,是不是多线程的问题,查了一下Connection的个数,也确实是10*线程个数。于是做了一个測试:

将maxPoolSize配置为5。执行以下的程序:

ComboPooledDataSource cpds = new ComboPooledDataSource("postgres");
for (int i = 0; i < 10; i++) {
cpds.getConnection();}
ComboPooledDataSource cpds2 = new ComboPooledDataSource("postgres");
for (int i = 0; i < 10; i++) {
cpds2.getConnection();}

maxPoolSize配置为5。一共想要获取20个链接,这时查看PostgreSQL Server端的连接数为5,正式预期的结果。

在执行以下的程序:

for (int i = 0; i < 2; i++) {
new Thread(new Runnable() { @Override
public void run() {
ComboPooledDataSource cpds = new ComboPooledDataSource("postgres");
for (int i = 0; i < 10; i++) {
try {
cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }, "Thread" + i).start();
}

两个线程,每一个线程想要获取10个链接数,这时查看PostgreSQL Server端的链接数,是10个。将i<2改为i<3,在执行一次,查看PostgreSQL Server端的连接数是15。

再进行以下的測试:

final ComboPooledDataSource cpds = new ComboPooledDataSource("postgres");
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Thread" + i).start();

创建3个线程,每一个线程须要10个Connection,这时查看PostgreSQL Server端的连接数是5。可见,PostgreSQL Server端的链接的个数与client创建的ComboPooledDataSource实例的个数成正比。C3P0配置文件里配置的内容都是针对一个ComboPooledDataSource实例的限制。

结论:

底层的原因大概是由于C3P0不是为多线程设计的,在底层JDBC也不是线程安全的。

详细的原因,有机会在详细分析。

一个应用中一般一个数据源仅仅用一个ComboPooledDataSource对象,也就是一个ComboPooledDataSource实例。

C3P0在多线程下的maxPoolSize配置的更多相关文章

  1. C3P0连接池详解及配置

    C3P0连接池详解及配置 本人使用的C3P0的jar包是:c3p0-0.9.1.jar <bean id = "dataSource" class = "com.m ...

  2. 关于Spring在多线程下的个人疑问

    在Web开发中,不可避免的是需要遇到并发操作的,并发操作就有可能会引发我们的多线程安全问题.比如说,我们多线程下访问同一个变量并且有一个线程做出修改那么就会使得我们另外的线程在不知情的情况下被修改自己 ...

  3. 在Windows平台下安装与配置Memcached及C#使用方法

    1.在Windows下安装Memcached 资料来源:http://www.jb51.net/article/30334.htm 在Windows平台下安装与配置Memcached的方法,Memca ...

  4. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  5. Java进阶专题(十五) 从电商系统角度研究多线程(下)

    前言 ​ 本章节继上章节继续梳理:线程相关的基础理论和工具.多线程程序下的性能调优和电商场景下多线程的使用. 多线程J·U·C ThreadLocal 概念 ​ ThreadLocal类并不是用来解决 ...

  6. C#多线程下的调优

    一.原子操作 先看一段问题代码 /// <summary> /// 获取自增 /// </summary> public static void GetIncrement() ...

  7. Linux下安装和配置JDK与Tomcat(升级版)

    在这个版本 Linux下安装和配置JDK与Tomcat(入门版) 的基础上优化升级 1.下载相关软件 apache-tomcat-6.0.37.tar.gz jdk-6u25-linux-i586-r ...

  8. 多线程下NSOperation、NSBlockOperation、NSInvocationOperation、NSOperationQueue的使用

    本篇文章主要介绍下多线程下NSOperation.NSBlockOperation.NSInvocationOperation.NSOperationQueue的使用,列举几个简单的例子. 默认情况下 ...

  9. Centos下安装和配置SVN

    1.安装SVN服务 #检查现有版本 rpm -qa subversion #如果存储旧版本,卸载旧版本SVN yum remove subversion #安装SVN yum install subv ...

随机推荐

  1. Linux 技巧之 Grub 超实用技巧

    1. 简单介绍 什么是 GRUB?GRUB 全名Grand Unified Boot Loader,它是一个引导装入器 -- 它负责装入内核并引导 Linux 系统.GRUB 还能够引导其他操作系统, ...

  2. ZOJ 1654 二分匹配基础题

    题意: 给你一副图, 有草地(*),空地(o)和墙(#),空地上可以放机器人, 机器人向上下左右4个方向开枪(枪不能穿墙),问你在所有机器人都不相互攻击的情况下能放的最多的机器人数. 思路:这是一类经 ...

  3. [Xcode]使用target进行协同开发

    协同开发时候发现难免会因为某些条件宏导致上传到SVN的代码影响到其他同时,但是每一次去修很多条件编译也不是很方便,所以可以通过新建自己的target来控制product. 一.创建自己的target: ...

  4. poj3974(manacher)

    传送门:Palindrome 题意:给定一个字符串,求最长回文子串. 分析:manach裸题,核心理解mx>i?p[i]=min(p[2*id-i],mx-i):1. #pragma comme ...

  5. 每日一小练——高速Fibonacci数算法

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: ...

  6. Unobtrusive Ajax

    ASP.NET MVC之Unobtrusive Ajax(五)   前言 这一节我们来讲讲Unobtrusive中的Ajax提交,大部分情况下我们是利用JQuery来进行Ajax请求,当然利用JQue ...

  7. 网络编程——XML与JSON

    概述 如上篇博客点击打开链接介绍.互联网公司发布Web服务,于是开发者们就可以将其用到自己的应用中.Web服务的工作方式类似于浏览器,输入请求,按下回车,等待远程计算机响应.当响应返回时,浏览器会使用 ...

  8. android插件技术-apkplug于OSGI服务基础-08

    我们提供 apkplug 下OSGI使用demo 源代码托管地址为 http://git.oschina.net/plug/OSGIService 一 OSGI与android Service 异同点 ...

  9. Android---App Widget(一)

    本文译自:http://developer.android.com/guide/topics/appwidgets/index.html App Widgets是一些较小的应用程序窗口,它们能够被嵌入 ...

  10. OpenStack镜像管理3

    第三部分 OpenStack镜像管理 一.简介 很多源都有为OpenStack已经编译好的各种镜像了,您可以直接下载并通过使用这些镜像来熟悉OpenStack. 不过如果是为生产环境进行部署的话,您一 ...