使用 objectbox 的网络服务器上有很多警告

lots of warnings on webserver using objectbox

我在带有 ObjectBox 的 nginx 代理后面使用 SparkJava(基本上是 Jetty)网络服务器。

我开始注意到很多

Hint: use closeThreadResources() to avoid finalizing recycled transactions (initial commit count: 213).
Hint: use closeThreadResources() to avoid finalizing recycled transactions (initial commit count: 213).
Hint: use closeThreadResources() to avoid finalizing recycled transactions (initial commit count: 213).
Hint: use closeThreadResources() to avoid finalizing recycled transactions (initial commit count: 213).
Hint: use closeThreadResources() to avoid finalizing recycled transactions (initial commit count: 213).
Hint: use closeThreadResources() to avoid finalizing recycled transactions (initial commit count: 213).
038-22:43:52.3260 [WARN ] Skipping low-level close for read-only cursor (non-creator thread 'java')
038-22:43:52.5815 [WARN ] Skipping low-level close for read-only cursor (non-creator thread 'java')
038-22:43:52.5815 [WARN ] Skipping low-level close for read-only cursor (non-creator thread 'java')
038-22:43:52.5815 [WARN ] Destroyed recycled transaction from non-owner thread 'java'
038-22:43:52.5820 [WARN ] Skipping low-level close for read-only cursor (non-creator thread 'java')
038-22:43:52.5820 [WARN ] Destroyed recycled transaction from non-owner thread 'java'
038-22:43:52.5821 [WARN ] Skipping low-level close for read-only cursor (non-creator thread 'java')

警告,在我的日志中,我正在考虑解决这个问题的方法。

我看到的建议可能是按照提示中的建议调用 closeThreadResources(),可能在每次调用结束后调用。但是,我不是 Jetty 方面的专家,也不确定每个线程是否被终止或可能被重用。如果线程被重用,调用 closeThreadResources() 可能会中断?另外,我有多个 ObjectBox 框,所以我可能不得不记住使用了哪些框,或者对所有框调用 closeThreadResources()。不完美,但可行。

在阅读 https://github.com/objectbox/objectbox-java/issues/753#issuecomment-525314808 之后,还有可能重用查询,这可能会解决问题。我可能会重做我的大部分代码来一次创建查询,然后在使用它们时设置参数值。当被网络服务器使用时,这有多线程安全?即,如果我更改查询的值以使用它,并且它已被另一个线程使用,会发生什么?

您可能想要做的是在处理完来自为其提供服务的线程的 Web 请求后调用 closeThreadResources()。这适用于线程池,它也被 web 服务器使用。您可以对所有请求执行此操作,例如servlet 过滤器,但不确定现在是否有更好的方法来做到这一点。

一些背景:每个使用 ObjectBox 的线程“缓存”一些资源(线程本地)。在使用 ObjectBox 线程“完成”(至少现在,例如,服务于 eb 请求)后,最好的清理方法是调用 closeThreadResources()。一旦该线程返回(例如从线程池),它将简单地再次分配它需要的资源。

查询:是的,您可以重复使用它们,但要确保锁定,例如查询时查询对象,因为您也可能与其他服务请求的线程竞争。