我使用的是带有ObjectBox的nginx代理后面的SparkJava (基本上是Jetty) web服务器。
我开始注意到很多
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之后,还可能重用查询,这可能会修复问题。我可能会重做我的大部分代码来创建查询一次,然后在使用参数值时设置它们。当它被when服务器使用时,它的线程安全性如何?例如,如果我更改了一个查询的值以使用它,而它已经被另一个线程使用,会发生什么?
发布于 2021-03-17 16:25:53
您可能想要做的是,一旦处理完来自服务它的线程的web请求,就调用closeThreadResources()。这与线程池一起工作得很好,线程池也被web服务器使用。您可以使用servlet过滤器对所有请求执行此操作,但不确定目前是否有更好的方法来执行此操作。
一些背景知识:每个使用ObjectBox的线程都会“缓存”一些资源(线程本地)。在线程被“完成”(至少现在,例如处理eb请求)之后,最好的清理方法是使用ObjectBox,它调用closeThreadResources()。一旦该线程返回(例如,从线程池中),它将简单地再次分配所需的资源。
查询:是的,你可以重用它们,但是在你查询的时候,请确保锁定查询对象,因为你可能也会与其他服务请求的线程竞争。
https://stackoverflow.com/questions/66665519
复制相似问题