java - 海量 MySQL 更新

标签 java mysql

我编写了一个服务器可以使用的应用程序。此应用程序收集信息,并将其发送到服务器。每 10 秒执行一次。数据量取决于玩游戏的玩家,但让我们将其保持在大约 50 个服务器,每个服务器发送 100 条数据(每 10 秒总共 5000 条)。

这些数据存在于 SQL 查询(在 PreparedStatement 语法中),SQL 查询的 Object[] 值,和服务器ID。
现在,我要处理所有的数据。这对我来说并不顺利。我有一个 MySQL 服务器,它有 5 个表。其中三个表不断更新,跟不上数据流。这些表是 InnoDB 表,主要是因为我可以用这种方式进行行级锁定,而不是表锁定。大多数查询都是 UPDATE 查询,几乎没有任何 INSERT 语句。

我已经尝试立即执行所有查询,这只会导致糟糕的性能,因为连接服务器也必须等待它完成。
我还尝试将所有查询放在一个大的 ConcurrentLinkedQueue 中,并每隔几秒清空一次该队列。性能更好,但这太慢了。
然后又尝试了per-table方案,还是稍微好一点。还是太慢了。
目前,它使用的是按服务器设置(为每个服务器创建一个新的线程,并在那里执行所有查询)。这还是太慢了。它跟不上。

如您所见,我已经尝试了很多方法。我也尝试过使用 addBatch(),然后使用 executeBatch(),它也在当前设置中使用。当然,我也看过这里、Google 等。有一些有用的信息,但主要是关于添加 PreparedStatements 和使用 BatchUpdates。

关于如何做到这一点有什么想法吗?

最佳答案

我用的是spring-jdbc,连接用的是com.jolbox.bonecp。我想推荐你使用相同的。

我使用 jdbcTemplate.batchUpdate(query, multyPreparedValues)其中 multyPreparedValuesList<Object[]>

但您也可以使用 BatchPreparedStatementSetter — 例如 https://stackoverflow.com/a/8873528/814304

关于java - 海量 MySQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15365856/

相关文章:

具有一系列值的 MySQL 和 CASE WHEN

php - 从没有出现在另一个表 PHP 中的表中选择

php - 如何检查字符串是否已经存在以及是否在末尾添加 +1?

java - 尝试在 Android 应用程序(java)上设置静音按钮

java - 如何在应用 MaskFormatter 后使 JTable 单元格中的插入符显示在左侧

mysql - 订单行并显示订单号

mysql - 1045 无法登录MySQL服务器

java - 每次我添加 google.android.gms :play-services-ads:18. 1.0 时 list 合并失败

java - 将自签名证书添加到 JRE keystore

java - Android 应用程序正在缓存 JSON