讨论,多个客户端连接一监听服务程序,客户端数量较多,如何解决数据库连接问题??

xingfuniao 2007-09-21 11:07:56
讨论,多个客户端连接一监听服务程序,客户端数量较多,如何解决数据库连接问题??

概述:
使用智能终端的无线GPRS传输数据到某电脑的公网IP的某个端口,该电脑有一监听程序监听该端口,使用INDY控件,同时与数据库相连,数据库是SQLSERVER2000。

当监听到有终端连接时,则创建一新线程,并进行数据处理,有可能查询和插入数据到数据库。

那么目前智能终端的数量可能很多,考虑到可能会有1000台终端同时连接到该监听程序并传输数据,连接的时间可能较短,比如每台终端的连接时间在5分钟。

那么问题就出现了,如果该监听程序使用1个adoconnection(既每个线程都有自己的adoquery,都连接该adoconnection),那么我了解到,这样可能会造成数据的阻塞。

但如果每个线程都独立的connection,那么数据库连接就要1000个,考虑到正版sqlserver2000的授权用户不可能买这么多,所以应该怎样处理呢?

我也有个想法,就是多个程序监听多个端口(终端可指定端口),每个程序1个connection连接数据库,每个端口最多连100个,我用10程序来监听,那么连接数据库的数量就是10,这样是否可以?

还是就使用1个连接,因为阻塞的问题好象不是经常出现

或者使用连接池实现,但没做过这种应用。

还请大家多多讨论,看有没什么好的方案!!!!
...全文
188 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingfuniao 2007-10-17
  • 打赏
  • 举报
回复
目前多个线程使用1个连接,暂时没发生问题
担心几百个同时连接:(

有没做过相似的系统的,说说经验!!
僵哥 2007-09-23
  • 打赏
  • 举报
回复
就是说,操作系统当中的线程是有限的,如果你的程序就开1000个线程,并且只服务一千个连接,那么别的程序呢?或者更多连接呢?

建议了解一下I/O完成端口吧。
xingfuniao 2007-09-21
  • 打赏
  • 举报
回复
分不够会继续加分
xingfuniao 2007-09-21
  • 打赏
  • 举报
回复
unsigned

1000个线程。。。如果连接数多的话,建议使用Overlapped I/O加线程池进行处理。比如I/O完成端口就是一个比较好的选择。
——————————————————————————

什么意思,没懂:(
僵哥 2007-09-21
  • 打赏
  • 举报
回复
1000个线程。。。如果连接数多的话,建议使用Overlapped I/O加线程池进行处理。比如I/O完成端口就是一个比较好的选择。
xingfuniao 2007-09-21
  • 打赏
  • 举报
回复
目前就是需要与终端进行交互,即监听程序要给终端返回信息。

而且目前使用INDY控件,有个问题,就是终端通过GPRS连接,但断开后,程序不能判断这个终端是否为断开状态,所以我做了最后更新时间,如果最后操作时间与当前时间差5分钟,我就主动将他断开,就是在5分钟同时1000个线程,呵呵,不知道咋处理了
僵哥 2007-09-21
  • 打赏
  • 举报
回复
1.根据应用情况,首先对Connection做一个有限池(可以是栈,也可以是队列),而操作所使用的不管是Table还是Query或是Storedproc等等,可以有任何多个,同样进行池化管理。等需要用的时候,先取一个可用的数据库连接,然后再找一个相应的操作控件,进行数据库操作,操作完成之后放回池中。这种方法比较适用于一应一答的服务模式;
2.开一个队列+一个数据库操作线程池,各线程拥有自己的数据库连接,请求报文到来之后,把数据整理好放到数据库操作队列当中,交由相应的线程池进行处理。这种方法比较适用于请求处理的模式,也就是说客户端发送过来之后就不需要理会数据库操作的结果。
2.在第二种应用之中增加一个处理结果回报,则可以处理更为复杂的逻辑。
ccdarkness 2007-09-21
  • 打赏
  • 举报
回复
用一个connection,一个adoquery,把SQL语句放到循环队列
定义一个结构用来标识这个操作是那个连接的,把查到的结果发到那个连接上

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧