Java 高效的数据库操作

Java 高效的数据库操作,java,performance,postgresql,jdbc,Java,Performance,Postgresql,Jdbc,以下是我正在研究的工作中解决方案的场景。我们在postgres中有一个表,用于存储网络上发生的事件。目前的工作方式是,当网络事件发生时插入行,同时删除与特定时间戳匹配的较旧记录,以便将表大小限制在10000条左右。基本上,类似于原木旋转的想法。网络事件一次爆发数千次,因此事务速率太高,导致性能下降,有时服务器崩溃或变得非常缓慢,除此之外,客户要求将表大小保持在一百万条记录以下,这将加速性能下降(因为我们必须不断删除与特定时间戳匹配的记录)并导致空间管理问题。我们正在使用简单的JDBC对表进行读/

以下是我正在研究的工作中解决方案的场景。我们在postgres中有一个表,用于存储网络上发生的事件。目前的工作方式是,当网络事件发生时插入行,同时删除与特定时间戳匹配的较旧记录,以便将表大小限制在10000条左右。基本上,类似于原木旋转的想法。网络事件一次爆发数千次,因此事务速率太高,导致性能下降,有时服务器崩溃或变得非常缓慢,除此之外,客户要求将表大小保持在一百万条记录以下,这将加速性能下降(因为我们必须不断删除与特定时间戳匹配的记录)并导致空间管理问题。我们正在使用简单的JDBC对表进行读/写。那里的技术社区能否建议更好的执行方法来处理此表中的插入和删除操作?

我想我会使用分区表,可能是所需总大小的10倍,插入到最新的分区中,然后删除最旧的分区

这使得“删除最早的”的负载比查询和删除小得多


更新:尽管我同意nos的评论,插入/删除可能不是你的瓶颈。可能先进行一些调查。

我想我会使用分区表,可能是所需总大小的10倍,插入到最新的分区中,然后删除最旧的分区

这使得“删除最早的”的负载比查询和删除小得多


更新:虽然我同意nos的评论,但插入/删除可能不是你的瓶颈。也许先进行一些调查。

有些事情你可以试试-

  • 写入日志,进行单独的批处理。写入表
  • 保持写操作不变,定期或在流量较低时执行删除操作
  • 执行对缓冲区/缓存的写入,使实际的数据库写入从缓冲区发生
一些一般性建议-

  • 由于您是基于时间戳删除的,请确保时间戳已编入索引。您也可以使用计数器/自动递增的rowId(例如,删除其中的id
  • 另外,JDBC批写入比单个行写入快得多(数量级的加速,很容易)。如果可以缓冲写入,一次批写入100行将非常有帮助

    • 有些事情你可以试试-

      • 写入日志,进行单独的批处理。写入表
      • 保持写操作不变,定期或在流量较低时执行删除操作
      • 执行对缓冲区/缓存的写入,使实际的数据库写入从缓冲区发生
      一些一般性建议-

      • 由于您是基于时间戳删除的,请确保时间戳已编入索引。您也可以使用计数器/自动递增的rowId(例如,删除其中的id
      • 另外,JDBC批写入比单个行写入快得多(数量级的加速,很容易)。如果可以缓冲写入,一次批写入100行将非常有帮助

      这里有关于震级的数字吗?10万条甚至200万条记录本身非常少。如果每秒有200万条记录,那么这也非常多,而每小时200万条记录就不多了。此外,提供此表的DB模式,包括您拥有的索引和您执行的典型查询将对我有很大帮助n建议改进。您有关于数量级的数字吗?10k甚至200万条记录本身非常少。如果每秒有200万条记录,那么这也非常多,而每小时200万条记录并不多。此外,请提供此表的DB模式,包括您拥有的索引和典型查询do在建议改进方面会有很大帮助。我会满足于24个分区,每天每小时1个分区。然后在可以清空的分区上使用TRUNCATE,因为TRUNCATE不需要真空。非常感谢您的快速和非常有用的响应。我上周刚刚开始这里,我将进一步研究我们的db模式、索引和q我会满足于24个分区,一天中每小时1个分区。然后在可以清空的分区上使用TRUNCATE,因为TRUNCATE不需要真空。非常感谢您的快速和非常有用的回复。我上周刚开始在这里,我将调查更多关于n我们的数据库模式、索引、查询以及其他可能成为瓶颈的内容,很快将发布所有详细信息。