Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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
Java 寻找实时解决方案:高效的数据库交互_Java_Database - Fatal编程技术网

Java 寻找实时解决方案:高效的数据库交互

Java 寻找实时解决方案:高效的数据库交互,java,database,Java,Database,在容器上部署了一个java应用程序名作为sbs,在其上部署了3个其他java应用程序,比如A、B和C 现在,应用程序A、B和C点击一个方法名,作为用于播放消息的应用程序sbs的Sing(id) 应用sbs的sing(id)方法,每秒点击200次左右,并为所有人播放消息 我的问题: DB表: 游戏ID:游戏ID 计数:此播放id的请求总数 上次日期时间:上次播放的日期和时间 游戏ID:1 总数:66 最后日期时间:2011年8月10日231145 现在更新表格 游戏ID:1 总数:92 最后日期时

在容器上部署了一个java应用程序名作为sbs,在其上部署了3个其他java应用程序,比如A、B和C

现在,应用程序A、B和C点击一个方法名,作为用于播放消息的应用程序sbs的Sing(id)

应用sbs的sing(id)方法,每秒点击200次左右,并为所有人播放消息

我的问题:

DB表:

游戏ID:游戏ID

计数:此播放id的请求总数

上次日期时间:上次播放的日期和时间

游戏ID:1

总数:66

最后日期时间:2011年8月10日231145

现在更新表格

游戏ID:1

总数:92

最后日期时间:2011年8月10日231344(约)

我必须更新此表,正如我前面提到的,此字段每秒更改200次。目的是了解此播放id在此时已播放了多少次

我该怎么做

每秒不可能访问数据库200次。因此我可以每隔4-5秒(周期性地)访问数据库一次并更新播放id的计数状态。我如何在应用程序方面做到这一点。需要每秒增加计数200次,并将值存储在某个位置,然后更新数据库…类似这样的…什么是最有效的方法

如果您有任何疑问,请告诉我


寻找你有价值的投入。提前感谢。

您可以每秒点击数据库200次或更多,但在您的场景中,这是不需要的。相反,制作一个内存中的同步计数器(比如一个带有原子整数的单例类),它在每次播放歌曲时都会递增,然后每隔30秒左右更新数据库中的计数值。我实际上做过类似的事情,效果很好。只需确保每个可数实体有一个计数器类实例(我猜这里是song),并且增加计数器值是线程安全的(原子整数应该考虑到这一点)

您可以每秒命中数据库200次或更多次,但在您的场景中不需要这样做。相反,制作一个内存中的同步计数器(比如一个带有原子整数的单例类),它在每次播放歌曲时都会递增,然后每隔30秒左右更新数据库中的计数值。我实际上做过类似的事情,效果很好。只要确保每个可数实体都有一个计数器类实例(我猜这里是song),并且递增计数器值是线程安全的(原子整数应该考虑到这一点)

正如您所说的,这个问题有些可疑:

  • 如果每4秒或5秒更新一次表是可以接受的,那么您将不可避免地“丢失”更新,
    count
    last\u date\u time
    的值将在查询时过期

  • 更糟糕的是(可能是),如果您的系统在上次更新后4.9秒崩溃,那么您的系统将完全丢失一些计数刻度

如果这些异常很重要,那么您别无选择,只能在每个
sing(…)
请求上同步保存
count
last\u date\u time
的值

但如果它们不重要,为什么要将这些信息保存在数据库中呢?为什么不把它全部保存在内存中,并接受当服务器崩溃并重新启动时计数会重置?或者,如果您需要保留计数以进行记帐,为什么不将“播放(id)”事件写入一个特殊的日志文件,并通过脱机扫描日志生成帐户


顺便说一句,每秒200次更新并不是不合理的,尤其是当表很小并且您进行了一些调整时


我可以承受4-5秒的记录更新延迟。。。。如果服务器在部署应用程序的地方崩溃,那么我们可以放一些逻辑…比如…如果特定播放id的计数值为零…从DB获取最后一个计数,然后将其增加到1

这种方法有一个明显的缺陷。在上一次更新和应用程序崩溃之间的时间间隔内,对于任何给定的歌曲,可能会有零次“播放”,或一次“播放”或多次“播放”。当应用程序返回时,它根本不知道那些“重头戏”是什么。。。除非它们被记录在某个地方,否则它无法知道


我们将这些信息保存在数据库中,因为根据这些记录,我们需要获取一些记录,比如这个时间戳(某物)播放了多少个播放id

最大的问题是。。。你还没有回答。。。如果你不偶尔数一些“戏”,这是否重要

  • 如果没有关系,那么缓存和每隔几秒钟更新一次就可以了
  • 如果这真的很重要,那么这个解决方案是不可接受的,因为在某些情况下它会失去一些机会
另一种选择是(正如我之前所说的)调优数据库;e、 g.选择最合适的数据库引擎/表类型/索引,并调优用于执行更新的SQL或存储过程。如果正确调整数据库,每秒200次更新的成本不会过高


如果我遇到的解决方案对我的性能影响不大,那么显然不会

如果真的是这样,那就用“每5秒保存一次”的方法。或者,如果您想在“5分钟”或“5小时”内获得更好的性能

事实上,我不认为你真的理解我的要求。。。因为(对于不了解您的业务的人来说)这并不重要,而且性能真的不应该与答案相关。它要么重要,要么不重要

让我换一种方式来回答这个问题:

“它会hur吗