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

问题描述

我在带有 ObjectBoxNginx 代理后面使用 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()。一旦该线程返回(例如从线程池中),它将简单地再次分配所需的资源。

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