一开始,我想为过度使用粗体文字表示歉意。我想简化对我那些冗长问题的理解。
我对数据的多重访问有问题。
我必须解决以下问题:
我有一个服务器应用服务器(基于tidserver),有很多(大约100个)tcp连接。
每个连接的目标都是:
从客户端获取状态消息(每2-5秒一次)。状态包含3
存储为文本的双倍数字。
从服务器发送应答到客户端-获取状态后
这些状态(大约100)必须保存在firebird数据库表中(我使用anydac)。每个客户机都有自己的编号和表中的记录。
另外三个本地网络客户端应用程序-本地应用程序也必须有表的访问权限。他们必须将表中的统计数据可视化。
本地应用程序有时必须更改表的一个记录。结果此更改必须通过服务器的TCP连接作为响应传递到正确的客户端。
问题在于这样一个解决方案的效率。
到目前为止,每一个tcp调用都将数据分别写入表中,导致firebird大量过载,并且本地应用程序执行的任何操作都非常缓慢。
另一个问题是:正确的方法是在服务器端建立一个本地阵列,从所有的TCP连接收集数据,并以固定的时间间隔(例如每2秒)将它们周期性地保存在表中吗?如果是,如何进行有效的数据同步:在读取数据时更改本地阵列上的锁并将其锁定以将数据保存到表中?
最好是对每个连接状态都使用sigle变量,然后在从一个客户端插入数据时使用local_数组以避免锁定local_数组中的每个字段?但它不是灵活的解决方案。
我的主意对提高效率有好处吗?或者说不是?有什么更好的解决办法?
当做
阿蒂克
最佳答案
看看CQRS pattern。
cqrs代表命令查询职责分离。其核心是一个简单的概念,即您可以使用不同的模型来更新信息,而不是使用模型来读取信息。这个简单的概念给信息系统的设计带来了一些深刻的影响。
从我的实验来看,这是在客户机-服务器体系结构中实现可伸缩性和响应性的一个非常好的模式。
您可以使用单独的数据库(如果可能,在内存中)进行查询,然后使用命令驱动的总线来写入数据。
这与您想要实现的非常接近。也许像这种cqrs模式这样的高级信息可以帮助您。
例如,在cqr中,为了提高速度,通常在单个事务中将多个命令连接到一个“批”sql语句中。有些数据库允许数组绑定,这使得它更快。
如果没有源代码,就很难找出问题所在。根据你显示的数字,我想你必须找到你的应用程序的真正瓶颈。我想你实际上还远远没有达到firebird的限制,但正是他们的使用方式使它受到限制。添加一些聪明的缓存,并使用一个清晰的cqrs模式可能会有很大帮助。