多线程程序中对数据库连接使用的疑问

ruby 03-09-10

容器:weblogic6
数据库:oracle8.1.7

描述:有一多线程程序运行在某一个端口上监听到来的消息,并将消息保存到数据库中。采用的是从weblogic连接池中获取连接的方式。

问题:如果在每个线程内部去获取连接的话,担心消息量大时会很快将连接池的可用连接耗尽,而影响与此程序共用此连接池的网站访问。而且在每个线程里面去获取连接,也比较耗时,效率较低。如果此多线程程序不用weblogic的连接池而是采用自己写的连接池的话,不知道效果如何,应该和用weblogic的连接池是一样的吧,因为oracle的并发连接数是一定的(购买时就定了)。无论有多少个池子在用,如果超过一定的限制,应该会在oracle端排队吧,这都是偶自己猜测的,没有根据,如果错了,不要骂偶哦。

请问有什么比较好的方式来处理这种情况么?

banq
2003-09-13 17:46

推荐在这两者之间加一个管道Queue, 一端将接受数据,然后保存到Queue中,另一端从Queue中读取消息 ,保存到数据库中。

Queue可以使用LinkedList实现。

ruby
2003-09-14 16:02

谢谢banq的回复!
偶想知道如果只有一个connection对象,有5个线程同时争用此connection来进行数据库操作,会发生什么?
一种是对此connection对象synchronized,则此多线程实际上和单线程没什么区别吧,因为每个线程要工作则必须拥有connection对象;二是如果不进行synchonized,又会发生什么情况呢?

banq
2003-09-15 12:00

你的理解是对的,一个线程必须拥有一个connection对象,这是设计的前提,如果不能保证这种实现,那么当然是错误的实现,带来系统不稳定、或数据出错,性能降低等问题,具体表现我也没有试验过,呵呵。

oldma
2003-09-15 13:48

〉想知道如果只有一个connection对象,有5个线程同时争用此connection来进行数据库操作,会发生什么?

只要5个线程不share一个statement,不会发生生么。每一个statment对应
oracle的一个独立的游标,能够独立的处理数据。而游标的数量是在数据的init.ora里设置的,对于的多线程的程序这个值要设的大一些,比较保险的做法还是控制并行线程的数量。

〉一种是对此connection对象synchronized,则此多线程实际上和单线程没什么区别吧,因为每个线程要工作则必须拥有connection对象;二是如果不进行synchonized,又会发生什么情况呢?

synchonized应该针对你的程序,connection的synchonized他自己已经做好了。