【问题标题】:lots of warnings on webserver using objectbox使用 objectbox 在网络服务器上出现大量警告
【发布时间】:2021-03-17 00:50:26
【问题描述】:

我在带有 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 之后,还有可能重用查询,这可能会解决问题。我可以重做大部分代码来创建一次查询,然后在使用它们时设置参数值。当被网络服务器使用时,这有多线程安全?即,如果我更改查询的值以使用它,并且它已经被另一个线程使用,会发生什么?

【问题讨论】:

    标签: embedded-jetty spark-java objectbox


    【解决方案1】:

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

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

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

    【讨论】:

    • 1) 当您说 Lock 时,您的意思是标准 Java 锁和同步等吗?我从来没有接触过那些东西,所以我会调查一下。 2)好的,我会尝试做closeThreadResources()的事情。我真的不知道什么是 servlet 过滤器,但是如果您认为自然线程处理 Web 服务器应该没问题,我会试一试。谢谢
    • 1) 是的,好老 synchronized 2) 如果你没有很多请求,你也可以在每个请求结束时手动调用它
    • 我有 20-30 个端点,我认为这就是 servlet 过滤器(在快速搜索之后)。我想我可以设置一个post() 操作,在每次调用网络服务器后发生。我想我会在那里添加它,然后在每个盒子上运行它(我大约有 10 个)。这样,无论是否使用过,我都可以确定清理每个盒子。我认为这应该足够干净,而且并不意味着我必须在所有 30 个端点中为每个特定框调用它,因为这将是一个真正的编码痛苦。懒惰!
    • boxStore.closeThreadResources() 应该处理所有 Box 实例
    • 只是跟进,因为是在 boxStore 级别进行的,所以我没有收到任何类型的警告。谢谢@markus
    猜你喜欢
    • 2014-11-21
    • 2013-04-27
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多