Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每当节点服务器上的数据发生更改时,就编写整个SQL表(奇怪的一个,请耐心等待)_Javascript_Sql_Oracle - Fatal编程技术网

Javascript 每当节点服务器上的数据发生更改时,就编写整个SQL表(奇怪的一个,请耐心等待)

Javascript 每当节点服务器上的数据发生更改时,就编写整个SQL表(奇怪的一个,请耐心等待),javascript,sql,oracle,Javascript,Sql,Oracle,好吧,让我先说我知道这很奇怪。我知道 但这里有: 假设我有一个存储数据的SQL数据库。假设我在这方面没有选择,它必须是SQL。我正在构建的应用程序的数据库中大约有100000条记录,一旦应用程序的用户处理完每一条记录,它们都会被发送到一个完全不同的应用程序。因此,在很短的一段时间内,此应用程序将被使用,然后停止使用,直到明年的同一时间。当应用程序正在使用时,任何外部源都不会触及数据库 当(节点)服务器启动时,它会将数据库中的所有内容加载到服务器上的对象文本中 这个应用程序的客户端在一个非常基本的

好吧,让我先说我知道这很奇怪。我知道

但这里有:

假设我有一个存储数据的SQL数据库。假设我在这方面没有选择,它必须是SQL。我正在构建的应用程序的数据库中大约有100000条记录,一旦应用程序的用户处理完每一条记录,它们都会被发送到一个完全不同的应用程序。因此,在很短的一段时间内,此应用程序将被使用,然后停止使用,直到明年的同一时间。当应用程序正在使用时,任何外部源都不会触及数据库

当(节点)服务器启动时,它会将数据库中的所有内容加载到服务器上的对象文本中

这个应用程序的客户端在一个非常基本的级别上,对数据发出请求(到服务器上的API),并在处理完记录后将更新版本发送回服务器

所以这里有点奇怪:假设我不希望客户端应用程序必须直接从数据库检索记录,也不希望它能够写入记录。因此,来自整个数据库的数据已经存在于服务器的内存中。服务器上有一个模块可以处理更改该数据的表示形式(同样,因为客户端应用程序只与服务器上的API交互,所以数据库模块的存在就是为了方便这一点)

多个用户同时访问系统,但由于系统的工作方式,不可能向两个用户发送同一条记录,因此两个用户永远不会向同一条记录发送回更新(记录是单独和顺序处理的)

因此,假设我决定,因为我已经在服务器上管理内存中的所有数据,所以每次更改时,我都会将当前数据的更新版本全部发送回数据库

问题是,这在疯狂的规模上排名在哪里

编写整个数据库而不是单个记录的性能显然会受到影响。但是,在一个只读取一次(在应用程序启动时)的数据库中,这是一个问题吗?如果除了“在任何内容发生更改时写入所有内容”之外的所有操作都发生在服务器的内存中,那么这些更新实际需要多长时间有关系吗?如果数据库在更新时出现新的更新,SQL肯定会处理这个问题吗

感觉这样做的正确方法当然是让每个用户直接从数据库获取他们的信息,并直接对数据库进行更新(或者至少与API端点交互以实现这一点),但是,只是……不这样做,完全是疯了吗

就像我说的,我知道这很奇怪,但除了“感觉有点不对劲”之外,我不确定我是否相信这是完全错误的。所以我想这个地方会有意见的

我认为它目前的工作方式是:

每当{in memory DB}上发生更改时,[SQL DB]就会更新 {in memory DB}根据对服务器的API调用以各种方式更新 请求数据,并发送数据更新,这两种更新都在内存数据库中处理

来自应用程序的多个请求可以同时发生,但多个用户不能看到同一条记录,因为记录在发送之前已分配给给定的用户

多个更新可以来自多个用户,每个更新最终都会在整个SQL数据库中结束,并保存到内存中数据库的内容


(注意:我不是说“这是最好的方法吗”。我只是问,如果不需要重新启动服务器就无法再次读取数据库,那么是否有重要的理由关心正在写入的数据库的性能)

在这种情况下,我想我会怎么做,是向每个缓存的记录添加一个属性,以指示该记录是“脏的”。换句话说,自最初从数据库读取该记录以来,有人对其进行了某些操作

(您还可以添加一个属性,指示某人“已“签出”此特定记录”,以便确保两个用户不会同时更新同一记录。)

在某个方便的时刻,您可以遍历集合,将“脏”记录发回数据库。使用SQL事务,不仅是为了提高效率,而且还要确保对数据库的最终更新是原子的

你需要非常注意比赛条件的可能性。一种可能的策略是使用Unix时间戳作为“脏”指示器。只有当记录的“脏时间”大于或等于提交进程上次运行时的时间戳时,才会选择记录过帐到数据库


(还有,p.S.:“不,我在这个疯狂的行业里疯狂地工作了这么多年,我甚至见过比这更“奇怪”的事情……”

我看到的问题是并发性:假设重写数据库需要5分钟。您必须使api处理程序异步,以防止客户端web浏览器超时——真的没有问题。但是当Bob提交更改,然后Sally在1分钟后提交更改时会发生什么?Bob的请求仍在忙于编写(正如您所说的,整个数据集),Sally的请求也希望这样做?您必须阻止(长超时+事务锁或带有布尔值和setTimeout的廉价n-nasty)为了防止数据不一致。如果您确实正确地锁定了所有内容,假设仍有5分钟的保存时间,那么您显然希望在关闭服务或数据库所需的时间内,平均每5分钟窗口不会收到超过1个请求。此外,在锁定和等待pus时