小弟对数据库连接数有些疑问想请各位大哥解释下    如果没用数据连接池的话,是不是1000个并发操作(访问数据库的增,删,改,查)就有1000个数据库连接呢?还是ORACLE等数据库自己设置的?超过这些链接数的话,是不是程序就一直出于等待状态还是把数据库DOWN掉了?    如果用数据库连接池的话。比如dbcp,最大连接数一般只设置几十,这个够用吗?同时几百个并发操作能处理完吗?如果一个操作没处理完就始终占用这个链接吧   我就是不太清楚数据库连接的个数是程序设定的还是数据库设定,大小有什么影响,设置不当会不会经常造成死机,在程序优化方面,连接池改怎么优化,谢谢

解决方案 »

  1.   

    还有如果自己没关闭数据连接,这个连接是不是始终就占用了?那岂不是很快就积累很多个没关闭的连接了?就把服务或者数据库DOWN掉了?
      

  2.   

    一个http请求通常是appServer的一个线程来处理,
    一个线程在一个时间点,如果正在做数据库处理,那么就占一个连接,
    n个人同时去点击一个查询页面,那么他们可能需要1~n个链接,最坏的情况就是n个人同时执行了数据库查询的代码,也就需要n个连接
    最大连接数和你的程序的并发用户数,以及你的程序的性能有关一般的应用50就差不多了,1000个用户在线不代表会同时做操作,同时操作也不代表会同时执行数据库查询代码
    一般,数据库连接如果不够用的话,可以适当加大最大连接数,如果还是不行,那就证明是性能问题,也就是数据库处理代码性能低下,每个用户占用的时间太长,释放的速度小于用户新请求连接的速度,这种情况很常见,需要做相应的优化,单纯增加最大连接数没有任何意义
      

  3.   

     如果没用数据连接池的话,是不是1000个并发操作(访问数据库的增,删,改,查)就有1000个数据库连接呢?(是的)超过这些链接数的话,是不是程序就一直出于等待状态还是把数据库DOWN掉了? (等待)
        如果用数据库连接池的话。比如dbcp,最大连接数一般只设置几十,这个够用吗?(绝大多数情况够用
    同时几百个并发操作能处理完吗?(这个不是很清楚,如果真的是同时操作可能有等待,不知道你说的并发到底是个什么概念)
    如果一个操作没处理完就始终占用这个链接吧 (没释放连接的话,就一直占用)
      

  4.   

    连接是需要close的,有很多人误认为用了连接池就会自动管理,这样是不对的即使用了连接池,也需要close,只不过这个close不会去关闭实际的数据库连接,而是把当前的connction对象返回到空闲连接池,供后面执行的程序再利用,如果不close,那么这个链接即使用完了,也一直是执行状态,后面的程序无法利用它,就会不断的新增连接,最终达到最大连接数
      

  5.   

        如果没用数据连接池的话,是不是1000个并发操作(访问数据库的增,删,改,查)就有1000个数据库连接呢?还是ORACLE等数据库自己设置的?超过这些链接数的话,是不是程序就一直出于等待状态还是把数据库DOWN掉了?看这些并发操作是否在一个连接里,如果每个操作都对应打开数据库和关闭数据库,那只能是1000个连接。
    一般数据池都管理数据库的链接,当不用的时候给你关闭,留一定的链接池让程序使用,如果达到设置的最大数,只能是等待,等关闭相应链接后继续。    如果用数据库连接池的话。比如dbcp,最大连接数一般只设置几十,这个够用吗?同时几百个并发操作能处理完吗?如果一个操作没处理完就始终占用这个链接吧  我就是不太清楚数据库连接的个数是程序设定的还是数据库设定,大小有什么影响,设置不当会不会经常造成死机,在程序优化方面,连接池改怎么优化,谢谢具体设置是跟本身的程序有关。这个不好说。
      

  6.   

    数据库和连接池都有连接数限制,比如都是20个不用连接池:1000个请求,980个会等待,20个去数据库,等待其中某个完了,如果你手动close连接,则会马上新生一个连接给第21个请求,如果你忘了close,则数据库连接挂起直到timeout,数据库自己回收掉,等回收完再新生连接。用了连接池:不用关心close问题,连接池存了一定数量连接,有谁用完了就给另一个请求,如果20个都被请求完了,也一样会等待,直到某个连接做完,再给下一个请求。连接池优点:不用开关连接(前20个还是要新开连接的),极大提高了效率。