`
jjhpeopl
  • 浏览: 108815 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库连接数和线程数

阅读更多
前几天开发一个多线程执行的任务,在多线程执行的时候,一直在报错,如下:
An attempt by a client to checkout a Connection has timed out.
com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@29426a4 -- timeout at awaitAvailable()
从异常信息能够看出,是数据库的连接池满了,然而还有新的线程去获取连接池,在获取新连接超过一定时间(用checkoutTimeout配置)后,就会报以上的错误。
 
从网上查到一些遇到相同问题的情况,但是都没真正解决我的问题。
有人说是c3p0在连接使用完毕之后,statement有可能会被缓存,从而导致connection没有真正的关闭掉,当有其他线程获取连接的时候,就获取不到了。但c3p0是默认关闭缓存的,从以下代码可以看出,必须配置maxStatements或maxStatementsPerConnection,若是不配置,它们的默认值都为0,也即不使用用缓存。
if (maxStatements > 0 && maxStatementsPerConnection > 0)
                this.scache = new DoubleMaxStatementCache( taskRunner, deferredStatementDestroyer, maxStatements, maxStatementsPerConnection );
            else if (maxStatementsPerConnection > 0)
                this.scache = new PerConnectionMaxOnlyStatementCache( taskRunner, deferredStatementDestroyer, maxStatementsPerConnection );
            else if (maxStatements > 0)
                this.scache = new GlobalMaxOnlyStatementCache( taskRunner, deferredStatementDestroyer, maxStatements );
            else
                this.scache = null;
 
 
既然是获取新连接超时,那就说明一下几点:
1、连接未正常关闭
2、连接池已经满了
3、线程数比连接数多
4、sql执行慢,占用连接时间长
 
从这几点中,可以分别调整
1、检查程序,是否连接未执行关闭操作
2、调整数据库连接数,但不是连接数越多越好,还得考虑线程数量
3、增加线程休眠时间,或减少线程数,但要保证业务的准确性,线程数可比数据库连接数多,可以综合数据库连接数、获取新连接超时时间(checkoutTimeout)、sql执行时间以及线程休眠时间来大致算出线程数的合适值
4、优化sql,尽量减少sql的执行时间,不要使用大sql,拆分sql执行
5、在获取失败之后,要有重试机制,保证业务正常执行 
6、优化程序和数据库之间的网络
7、适当增加acquireIncrement的值,默认为3
 
最后举个例子
checkoutTimeout配置为3000,也就是超时时间为3000毫秒
maxPoolSize为15,默认值就是15
每个线程执行sql的时间都是10ms,那么同时执行的线程数最好低于4500个=(checkoutTimeout / 10ms) * maxPoolSize 
分享到:
评论

相关推荐

    多线程下mysql连接数过多解决demo

    多线程下mysql连接数过多解决demo

    Python MySQL数据库连接池组件pymysqlpool详解

    pymysqlpool (本地下载)是数据库工具包中新成员,目的是能提供一个实用的数据库连接池中间件,从而避免在应用中频繁地创建和释放数据库连接资源。 功能 连接池本身是线程安全的,可在多线程环境下使用,不必...

    针对WAS6.1,对线程数、jvm,日志以及数据库连接进行性能调优

    针对WAS6.1,对线程数、jvm,日志以及数据库连接进行性能调优

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发,CPU磁盘占用情况 1.数据库连接池 2.Durid介绍(官方文档) 3.编码,问题,常规并发操作 3.1.JDBCUtil....

    解决mysql数据库连接过多的错误

    如果threads_connected == max_connections时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现类似强坛的报错信息。

    Python基于多线程操作数据库相关问题分析

    python多线程并发操作数据库,会存在链接数据库超时、数据库连接丢失、数据库操作超时等问题。 解决方法:使用数据库连接池,并且每次操作都从数据库连接池获取数据库操作句柄,操作完关闭连接返回数据库连接池。 *...

    Arc SDE连接数超限处理方式

    本文档用于解决Arc SDE用户数超限的问题

    delphi实现数据库连接池

    delphi 实现数据库连接池,可以初始化连接池中数据库连接个数,动态创建新连接,及多线程互斥获取资源。

    多线程访问mysql数据库

    SetMaxConnectNum------设置mysql最大的连接数?,当调用ConnectDB的时候会创建X个数据库连接 SetCharset------设置编码格式,主要是GB2312还是UTF8 ConnectDB------连接数据库 GetIdleMySql------获取一个未使用的...

    SQLServer数据库连接池.rar

    易语言SQLServer数据库连接池模块带例程 SQLServer数据库连接池,支持多线程下运行,如果网络断开,在操作时自动重连一次。连接数据库采用精益模块的【类_ODBC】。资源访问采用易语言自带的许可证。运行效率足够中...

    详解多线程Django程序耗尽数据库连接的问题

    主要介绍了多线程Django程序耗尽数据库连接的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    workerman写mysql连接池的实例代码

    首先要了解为什么用连接...由于PHP是单进程单线程的,使用PHP实现数据库连接池,肯定需要用单独的进程去做,那么就会涉及到进程间的通讯,使得原本和mysql直接通讯的过程变成 与连接池再到mysql的通讯,增加了应用端的

    定时读取PDF文件,并批量插入到数据库

    定时读取PDF文件并且批量插入38W条数到数据库,里面包含线程定时执行线程,事务批量插入,读取配置文件工具类,数据库连接工具类,日期工具类,一个小的项目。

    python使用多线程查询数据库的实现示例

    一.背景:  当数据量过大时,一个程序的执行时间就会主要花费在等待单次查询返回... 数据库连接池:限制了数据库的连接最大个数,每次连接都是可以重复使用的,当然也可以限制每个连接的重复使用次数(这个在这里是

    数据库学习基础之名词解释

    DB2采用了数据分级技术,能够使大型机数据很方便地下载到LAN数据库服务器,使得客户机/服务器用户和基于LAN的应用程序可以访问大型机数据,并使数据库本地化及远程连接透明化。 它以拥有一个非常完备的查询优化器而...

    2019蚂蚁金服面试题.zip

    一面 1、自我介绍、自己做的项目和技术领域 ...数据库:Mysql(缓存命中、索引、单条SQL性能、数据库线程数、数据池连接数) 中间件:1.消息2、负载均衡3、缓存(包括线程数、连接数、日志)。 网络: 吞吐量、吞吐率

    IT-数据库(1).docx

    2015年7月30日 14点30分 试题数:123,重复命题数:33,重复命题率:26.83% 1. 每个数据库有且只有一个( )。 A.次要数据文件 B.主要数据文件 C.日志文件 D.索引文件 答案:B 2. 当前数据库运行在open状态,LISTENER...

    Oracle 12c 新特性之多线程数据库操作

    数据库是以多进程的方式运行的,当一个会话连接进来,就会通过监听,然后在服务器上创建一个进程。而在Windows上面它是以多线程的方式来运行的。一个进程有很多个thread线程。而在12c这个版本上面,Oracle在Unix/...

    强大的Java连接池类 for .Net

    我自行开发的一套Java平台的数据库连接池类,内部使用的是线程控制,其详细原理说明在CSDN进其将有所发布,届时也有源代码结实说明,该压缩文件中包含连接池运行的jar文件和其帮助手册中文版,未竟严格代码测试) ...

Global site tag (gtag.js) - Google Analytics