多线程、数据库、TServerSocket的问题(100分)

G

gben

Unregistered / Unconfirmed
GUEST, unregistred user!
根据Delphi 4 开发大全上讲,每个线程必须在一个单独的BDE会话期中。
我根据它在TServerSocket中OnGetThread事件产生的线程中动态生成
一TSession和DataBase,来连接MS_SQL数据库。但是当线程产生到10个左右
程序就会报错:BDE访问所需的内存不够。不知道是何原因。我用Delphi
自身所带的SQL Explore来连接上SQL服务器。当我同样开上10个左右的
SQL Explore,同样连接上SQL服务器,还是报告同样的错。

我现在所做的程序主要是想实以下现目的:
1:服务端负责接受客户端通过InterNet发来的数据,并将数据存数据库中。
2: 服务端采用多线程方式和阻塞方式。

问题:1:如果以上问题不能解决,我该怎么样解决在多线程中将数据存入到
数据库中。
2:我现在是用的一的在主程序中TSession和TDatabase来连接
数据库,然后将他们作为参数传如到线程中,不知道这样做会用
什么样的暂时不可预知的错误。(我现在做测试他是可以的,但比较
慢)

分不在多,技术交流第一。呵呵:)
 
session 要在一个constructor里,用Synchronize函数才可以在一个线程里
调用 vcl.好象答非所问,听听吧.呵呵.到时候请给1分
 
想请问一下你的客户端数据通过internet传到数据库,是以什么格式传呢?
我现在也遇到类似的问题,本地局域网有一数据库,internet上有一总数据库
如何实现定时多数据库的数据同步(多客户端)?

帮不上忙反而添乱子了,真不好意思,麻烦指教一下,谢谢!
 
DSM2000:
格式是自己定义的。总体原则上是
版本+长度+(包控制信息)+数据

欢迎大家对我开始提出的问题进行探讨。
 
有对此问题精通的吗?非常焦急。。。。
 
我觉得你可以加个控制吧,例如当到达9个线程时不再响应客户端请求。
直到有线程释放以后再响应。
另外,对于远程数据库操作,可以使用MIDAS,封装得很好了,很多麻烦不用自己处理。
 
自己写个队列Queue来存放数据,在由一个或多哥线程来写数据库,TServerSocket中
OnGetThread事件中将数据写入Queue中。不过你的Queue必须是线程安全的。
 
显然你给BDE开的内存太小,扩大BDE所占内存:
设置BDE的MEMSIZE为所需大小。
BDE缺省内存为16M,大概也就够十个实例吧。
 
如果还是不行,而你必须支持多于十个的客户连接,倒有比较麻烦的一个办法:

你可以自己实现一个数据库连接的类,在这个类中访问一个数据库连接池,连接
池中最多就建立9个连接,如果连接池中的连接已经用完,就让你的数据库连接类
暂时挂起,知道有一个连接池中的连接空闲为止。在你的数据库连接对象中每次
用完数据库,可以释放连接对象到连接池。

呵呵,一个笨办法,只是说明可以牺牲时间换取空间。
 
我们以前做过类似的程序,不需要创建多个session/database/...
在winsocket的线程中共享一个连接,读写数据库没有问题。
 
多谢各位大虾的参与,在这里我有几点解释。
1。我程序要求大概有同时1000个连接(不断线)
2。每个连接都在活动(即都有可能在查询数据库).
3。我的程序基本已经完工。但无法现在模拟真实环境。不知道大家有兴趣帮我在网
上做联合测试否。
4。我现在最担心的就是服务器端。如果用多线程方式,那岂不是开最大要开到1000
个线程,能行吗?
5。还有,在这1000个线程中涉及到数据库的访问。我现在是在主程序中用TSession
和TDatabase来连接数据库,然后将他们作为参数传到线程中,但是这与很多书
上讲的在多线程中访问数据库中要一单独的BDE会话(TSession),我这样做恰恰
与之相反。我现在大概4-5个连接没问题,但不知道连接一多后,会产生什么样
的后果。对此我才是最关心的。
6.我在客户端也是线程工作方式。我现在是查询客户端的数据库是Access2000.
我是通过odbc连接的。不只大家有没有什么好的方法来直接访问Access2000
(即:DAO4.0)

 
没办法。只有来刷新来引起朋友们注意了。
呵呵。:)
 
==1000!!??跟踪
 
附加功能 将问题提前
 
gben:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
做个线程池,那就不用建那么多线程了,打个比方:
你建10个线程,有用户要进行数据库操作就把一个线程分配给他,如果10个线程都用完了,
那就看哪个线程处于挂起就把那个线程给新用户,等原来的用户又有操作数据库的请求时
再分配给他。当然你要用一个主线程去循环线程池。
 
gben:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。

 
多人接受答案了。
 
顶部