讨论,多个客户端连接一监听服务程序,客户端数量较多,如何解决数据库连接问题??
讨论,多个客户端连接一监听服务程序,客户端数量较多,如何解决数据库连接问题??
概述:
使用智能终端的无线GPRS传输数据到某电脑的公网IP的某个端口,该电脑有一监听程序监听该端口,使用INDY控件,同时与数据库相连,数据库是SQLSERVER2000。
当监听到有终端连接时,则创建一新线程,并进行数据处理,有可能查询和插入数据到数据库。
那么目前智能终端的数量可能很多,考虑到可能会有1000台终端同时连接到该监听程序并传输数据,连接的时间可能较短,比如每台终端的连接时间在5分钟。
那么问题就出现了,如果该监听程序使用1个adoconnection(既每个线程都有自己的adoquery,都连接该adoconnection),那么我了解到,这样可能会造成数据的阻塞。
但如果每个线程都独立的connection,那么数据库连接就要1000个,考虑到正版sqlserver2000的授权用户不可能买这么多,所以应该怎样处理呢?
我也有个想法,就是多个程序监听多个端口(终端可指定端口),每个程序1个connection连接数据库,每个端口最多连100个,我用10程序来监听,那么连接数据库的数量就是10,这样是否可以?
还是就使用1个连接,因为阻塞的问题好象不是经常出现
或者使用连接池实现,但没做过这种应用。
还请大家多多讨论,看有没什么好的方案!!!!
[解决办法]
用一个connection,一个adoquery,把SQL语句放到循环队列
定义一个结构用来标识这个操作是那个连接的,把查到的结果发到那个连接上
[解决办法]
1.根据应用情况,首先对Connection做一个有限池(可以是栈,也可以是队列),而操作所使用的不管是Table还是Query或是Storedproc等等,可以有任何多个,同样进行池化管理。等需要用的时候,先取一个可用的数据库连接,然后再找一个相应的操作控件,进行数据库操作,操作完成之后放回池中。这种方法比较适用于一应一答的服务模式;
2.开一个队列+一个数据库操作线程池,各线程拥有自己的数据库连接,请求报文到来之后,把数据整理好放到数据库操作队列当中,交由相应的线程池进行处理。这种方法比较适用于请求处理的模式,也就是说客户端发送过来之后就不需要理会数据库操作的结果。
2.在第二种应用之中增加一个处理结果回报,则可以处理更为复杂的逻辑。
[解决办法]
1000个线程。。。如果连接数多的话,建议使用Overlapped I/O加线程池进行处理。比如I/O完成端口就是一个比较好的选择。
[解决办法]
就是说,操作系统当中的线程是有限的,如果你的程序就开1000个线程,并且只服务一千个连接,那么别的程序呢?或者更多连接呢?
建议了解一下I/O完成端口吧。