例子生动解释c3p0数据库连接池

来源:互联网 发布:微信幸运大转盘源码 编辑:程序博客网 时间:2024/05/21 06:48

你出生在古代,并且开了个餐馆。但你比较笨,一开始炒菜时,每炒一道菜都要 生火,炒菜,灭火, 炒第二道菜又要 生火,炒菜,灭火,第三道菜如此....。

开了几天饭馆后,你觉得做菜很慢,跟不上客户的速度,老被骂,冤枉啊!然后你就分析了,劈材生火最浪费时间,你一拍大腿:“我怎么就没想到呢? 靠,我炒菜后不灭火不就快了吗?”

掌握了“不灭火大法”真理的你,炒菜速度越发加快,赢得了新老食客的一致好评。美丽女顾客:“上菜真快呀,亲!”。

由于生意太好,好评率100%,顾客大大增加了,你的炒菜速度又跟不上了,你想啊想啊,怎么样才能增加效率呢? 突然,正看着锅里“卤煮寒鸦儿”菜,冰雪聪慧的你突然一拍大腿,这些煮菜、炖菜太费时,而出锅速度快的炒菜要在后面排队。我应该同时使用2个锅(与炉子)不断火来做菜,不,3个锅!

锅台的增加使你做菜效率翻了几倍,食客和他们的小伙伴都惊呆了!然后,顾客自然更多了,面对熙熙攘攘等待上菜的食客,你的嘴角又露出一丝令人不易察觉的奸笑:“继续增加锅台!”。

可惜这村子小,锅呢?很贵,你买不起,都是从炊具店租来的。随着你同时启用的锅越来越多,终于,炊具店没货了。这时,你已经整整使用了20个锅,有好几个伙计在同时做菜。

你仰天长啸,“看来老夫最大只能使用同时20个锅了,吉尼斯纪录破不了了!已经到了我的maxPoolSize了!”

maxPoolSize:连接池中保留的最大连接数。默认为15

伙计:“老板,你说什么鸟语?我怎么听不懂啊?”
你:“要不怎么我当,老板你当伙计呢?”
伙计暗忖:“你妹的!” 

----------------------------由于打字叙述太麻烦,以下全部使用对话来阐述剧情

由于启用了20个锅台,生意大好,到了晚上,伙计问道:“老板,明天我们上午开张时,一开始同时烧几个锅子呀?”
你想了想:“5个把,烧少了客人多了来不及。”
伙计:“得令!”
你:“恩,就把initialPoolSize设成5就行了?”
伙计:“..............”
伙计:“奥,那一开始开5个锅,之后呢?客人多了我们增加锅是一个一个加吗?”
你:“笨死了,记好了,当锅不够用了的时候,一次加acquireIncrement个!”
伙计:“....你说啥?”
你:“额,3个,把acquireIncrement设为3.”
伙计:“恩,3个,记住了,其他的听不懂。”

initialPoolSize:初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3

acquireIncrement:当连接池中的连接用完时,C3P0一次性创建新连接的数目

一天后

伙计:“哦,老板,一开始开5个锅,后来每次连开3个锅,连续生火太呛人,大家都受不了了,我们应该在每个锅点火之间休息一小下。”
你:“有理,就休息acquireRetryDelay毫秒把,额,10秒,懂了吗?”
伙计:“懂了,太好了,每次给我们10秒钟来休息,您真是我们的好老板啊!”

acquireRetryDelay:两次连接中间隔时间,单位毫秒,默认为1000

一天后

伙计:“对了,老板,今天小张伙计一天都在偷懒。”
你:“怎么回事?”
伙计:“小张今天拿到了一个坏锅,怎么也点不着火,然后他就一直点,一直点,一天都没干活,哼!我都累死啦!”
你:“这个小张,真是个滑头,好吧。我们从明天立一个规矩,锅点不着火后,只允许重试acquireRetryAttempts次,就设置为10次把,如果超过10次,就要像我提出异常,我去联系炊具店来修理,你们就无法偷懒了,哇卡卡卡卡卡!”

acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30

一天后

伙计:“老板,我们人手不够了,20个锅,差不多需要7个人才能耍的过来,人少时候,利用不了全部的20个锅。”
你:“好办,把numHelperThreads设为7,你们每个人就是一根线程,记住喽!”
伙计:“我们是什么?”
你:“线程!”
伙计:“........”
伙计:“哦,我去干活了。”
你:“你早就该去干活去了,哼!”

numHelperThreads:C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为3


一天后

伙计:“老板,不好了,小张伙计又偷懒了!”
你:“我操,他又怎么了?”
伙计:“由于20个锅已满,他拿不到第21个锅,就在那里等着,也不去切菜、刷碗,太偷懒了,我都要累死了!”
你:“懂了,把checkoutTimeout设为100000,只要他等待超过100秒,就要像我报异常,我来为他重新分配任务!”
伙计:“太好啦!!”

checkoutTimeout:当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒,默认为0

一个月之后

你:“伙计们,我们开店终于有1个月了,大家来算一下我们盈利的多少钱,大家分分红,我这个人还是很开明的嘛,哈哈哈哈!”

伙计:“报告老板,本店本月净亏 2000 两纹银!”

你:“怎么回事?我来看一下账目!”
你:“为什么木柴花钱这么多!!!!!”

伙计:“因为每天开始时候是5个锅,然后客人多了,每次开3个锅,最后20个锅全开。然后吃饭高峰过去后客人少了,我们的20个锅都还烧着,其实很多时候并没有菜需要炒。”
你:“你们为什么不关锅?????”

伙计:“我们炒菜好了,不知道下面有没有客人来,无法确定刚用完的锅需不需要灭。”
你:“这样吧,凭你们的智商也解决不了了,从明天开始,你们炒菜的时候也要长点心,每idleConnectionTestPeriod秒钟,也就是,额,100秒吧,每100秒检查一下全部的20个锅,如果发现了某个锅已经空闲了maxIdleTime秒钟没有炒菜,就把他关了,额设为60秒吧!

idleConnectionTestPeriod:隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查

maxIdleTime:最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0


伙计:“老板英明,不过,如果一段时间没人吃饭,所有锅都关了,再来客人的时候,生火来不及啊,我们是不是应该保留最少几个锅一直不关呀?”
你:“我靠,跟我说一席话胜,胜读你十年书啊,你小子是智商见长啊!这样吧,最后留3个锅的火就行了,这就是minPoolSize。” 

minPoolSize:连接池中保留的最小连接数

你:“恩,说了那么多,你看看怎么样更好的使用锅呀?”
伙计:“我们可以对锅进行检查测试,然后再使用。”
你:“有理,何时检查?”
伙计:“把testConnectionOnCheckin设成true就可以在每次新开一个锅的时候检查了,如果把testConnectionOnCheckout设成true就可以在每次炒菜的时候检查了。”

 

testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。默认为false

 

testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。默认为 false

你:“我擦,原来你会英语啊!”
伙计:“我,我,我,我说了什么了?我什么都不知道啊!”

你:“小张、小王、小李,速来把这个伙计拖到后面,乱棍打死,他知道的太多了。”
小张、小王、小李:“嘿嘿,我们等了好久了!”

“啊啊啊啊”

就在这个时候,你被经理一巴掌拍醒。
经理:“别睡啦!天亮啦,起来干活啦!昨夜让你通宵加班,你却在电脑前睡觉,这样吧,今晚你再通个宵!”
你:“............”

0 0
原创粉丝点击