Java 高效的数据库操作
以下是我正在研究的工作中解决方案的场景。我们在postgres中有一个表,用于存储网络上发生的事件。目前的工作方式是,当网络事件发生时插入行,同时删除与特定时间戳匹配的较旧记录,以便将表大小限制在10000条左右。基本上,类似于原木旋转的想法。网络事件一次爆发数千次,因此事务速率太高,导致性能下降,有时服务器崩溃或变得非常缓慢,除此之外,客户要求将表大小保持在一百万条记录以下,这将加速性能下降(因为我们必须不断删除与特定时间戳匹配的记录)并导致空间管理问题。我们正在使用简单的JDBC对表进行读/写。那里的技术社区能否建议更好的执行方法来处理此表中的插入和删除操作?我想我会使用分区表,可能是所需总大小的10倍,插入到最新的分区中,然后删除最旧的分区 这使得“删除最早的”的负载比查询和删除小得多Java 高效的数据库操作,java,performance,postgresql,jdbc,Java,Performance,Postgresql,Jdbc,以下是我正在研究的工作中解决方案的场景。我们在postgres中有一个表,用于存储网络上发生的事件。目前的工作方式是,当网络事件发生时插入行,同时删除与特定时间戳匹配的较旧记录,以便将表大小限制在10000条左右。基本上,类似于原木旋转的想法。网络事件一次爆发数千次,因此事务速率太高,导致性能下降,有时服务器崩溃或变得非常缓慢,除此之外,客户要求将表大小保持在一百万条记录以下,这将加速性能下降(因为我们必须不断删除与特定时间戳匹配的记录)并导致空间管理问题。我们正在使用简单的JDBC对表进行读/
更新:尽管我同意nos的评论,插入/删除可能不是你的瓶颈。可能先进行一些调查。我想我会使用分区表,可能是所需总大小的10倍,插入到最新的分区中,然后删除最旧的分区 这使得“删除最早的”的负载比查询和删除小得多
更新:虽然我同意nos的评论,但插入/删除可能不是你的瓶颈。也许先进行一些调查。有些事情你可以试试-
- 写入日志,进行单独的批处理。写入表
- 保持写操作不变,定期或在流量较低时执行删除操作
- 执行对缓冲区/缓存的写入,使实际的数据库写入从缓冲区发生
- 由于您是基于时间戳删除的,请确保时间戳已编入索引。您也可以使用计数器/自动递增的rowId(例如,删除其中的id
- 另外,JDBC批写入比单个行写入快得多(数量级的加速,很容易)。如果可以缓冲写入,一次批写入100行将非常有帮助
- 有些事情你可以试试-
- 写入日志,进行单独的批处理。写入表
- 保持写操作不变,定期或在流量较低时执行删除操作
- 执行对缓冲区/缓存的写入,使实际的数据库写入从缓冲区发生
- 由于您是基于时间戳删除的,请确保时间戳已编入索引。您也可以使用计数器/自动递增的rowId(例如,删除其中的id
- 另外,JDBC批写入比单个行写入快得多(数量级的加速,很容易)。如果可以缓冲写入,一次批写入100行将非常有帮助