【发布时间】:2023-04-01 19:30:01
【问题描述】:
我正在尝试使用 Grails 和 json 对 postgres 数据库进行一次大的事务更新。我有一个压缩的 json 文件,我正在从中读取属性并相应地更新数据库。
好吧,我正在从文件中读取 json
new FileInputStream("/home/export.gz")
将其传递给解压缩流并创建 json 解析器
GZIPInputStream gzipInputStream = new GZIPInputStream(is)
JsonParser jp = new JsonFactory().createParser(gzipInputStream);
正在解析 json 字段...
while (jp.nextToken() != null) {
if (jp.getCurrentToken() == JsonToken.START_OBJECT) {
if (jp.nextToken() == JsonToken.FIELD_NAME) {
...
}
}
}
像这样从数据库中加载每一行
private <C> C getById(Class<C> clazz, def id) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(clazz).setCacheMode(CacheMode.IGNORE)
criteria.add(Restrictions.idEq(id))
return (C) criteria.uniqueResult()
}
获取行,设置字段,刷新每一行
private void flushAndEvict(def o) {
sessionFactory.getCurrentSession().flush()
sessionFactory.getCurrentSession().evict(o)
o.discard()
}
问题是这种方法随着时间的推移变得越来越慢。 开始时更新 500 行/秒,更新约 4000 行,速度为 100 行/秒,到更新 30 000 行时,速度为 10 行/秒,50 000 更新约 5 行/秒。
监控性能我发现内存一切正常,gc 峰值不会超过 5% 的 cpu 时间。
CPU 正在全功率运行,100%,50%(挂墙时间)睡眠,42% SocketInputStream.read(byte[], int, int)。
我看到更多的是套接字读/写速度变慢,从 10 kb/s 开始,会话结束时为 5kb/s。
我试图了解这里的瓶颈以及如何提高性能。什么会导致这种速度下降?
【问题讨论】:
-
我不明白您为什么说要进行大笔交易并且要刷新您保存的每个域。你在做任何交易吗?
-
@juandiegoh 井数据需要保持一致,我不能部分更新。要么全有,要么全无。
-
据我所见,您并没有进行事务处理,您是否尝试过失败并正在回滚?还是必须从数据库中删除才能重新开始?
标签: json performance postgresql grails