当前位置: 首页 > 知识库问答 >
问题:

日志警告:检测到线程不足或时钟跳跃(housekeeper delta=springHikariConnectionPool)

吴峰
2023-03-14

我正在使用HikariCP 2.4.6,在Tomcat 8启动时,我收到一条警告消息:

01-Aug-2016 11:18:01.599 INFO [RMI TCP Connection(4)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Initializing Spring FrameworkServlet 'Spring MVC Dispatcher Servlet'
[2016-08-01 11:18:01,654] Artifact blueberry:war exploded: Artifact is deployed successfully
[2016-08-01 11:18:01,655] Artifact blueberry:war exploded: Deploy took 33,985 milliseconds
Aug 01 2016 11:26:52.802 AM [DEV] (HikariPool.java:614)
WARN : com.zaxxer.hikari.pool.HikariPool - 9m13s102ms - Thread starvation or clock leap detected (housekeeper delta=springHikariConnectionPool).

我没有看到从DB读/写的任何其他错误或问题。这有什么值得担心的吗?我试着四处寻找,但没有运气。

我们也在使用Hibernate 4.3.8。最后是MySQL 5和MySQL 5.1.39连接器以及Spring 4.1.0。释放。我们正在努力升级到Hibernate 5,并将看看这是否会消失,但不知道这是否重要。

共有3个答案

殳凯捷
2023-03-14

发生这种情况的另一个原因是由于过多的垃圾回收机制,当垃圾回收机制在两次内务线程执行中运行更长时间时,试图释放一些内存(例如,当应用程序线程运行“选择”查询时)。由于GC阻塞了包括内务线程在内的所有应用程序线程,因此我怀疑时钟因此“跳跃”。

江敏学
2023-03-14

这里有一个关于为什么时钟跳跃检测可能合法发生的很好的概要。引用布雷特·伍尔里奇的外部链接:

这在housekeeper线程上运行,该线程每30秒执行一次。如果您使用的是Mac OS X,则时钟源是系统。currentTimeMillis(),时钟源为系统的任何其他平台。nanoTime()。理论上两者都是单调递增的,但各种因素都会影响这一点,例如NTP服务器。大多数操作系统设计用于处理向后的NTP时间调整,以保持时间向前流动的错觉。

这段代码是说,如果时间向后移动(现在

可能会发生以下几件事:

>

  • 您可能正在一个虚拟容器(VMWare、AWS等)中运行,由于某种原因,该容器在保持时间向前流动的错觉方面做得特别差。

    由于housekeeper线程中会发生其他事情,特别是关闭空闲连接,因此出于某种原因,关闭连接可能会阻塞housekeeper线程两个以上的内务处理周期(60秒)。

    服务器非常繁忙,所有CPU都被挂起,导致线程不足,这使得housekeeper线程无法运行两个以上的内务期。

    考虑到这些,也许你可以提供额外的背景。

    编辑:请注意,这是基于HikariCP 2.4.1代码的。确保您运行的是可用的最新版本。

    (看起来参数也在最新代码中的警告语句上更新了。)

  • 蓟和煦
    2023-03-14

    另一个原因是,如果你在本地运行应用程序,而计算机进入睡眠状态,就会发生这种情况。在这种情况下,您不需要进行任何配置操作。

     类似资料:
    • 这里hikari conf: 在我的静态编程语言项目中: 这很好。美好的 但有时我会在日志中收到这样的警告消息: 因此,它停止向数据库插入新记录。

    • 问题内容: 我通过PuTTY和WinSCP连接到我大学的小型Linux集群,使用后者传输文件,并使用前者进行编译和运行。到目前为止,我的工作是在大学的实验室中进行的,但是今天我一直在家里进行一些工作,从而产生了有趣的警告。 我上载了整个文件夹,在运行命令后,将其作为输出的最后一行: make:警告:检测到时钟偏斜。您的构建可能不完整。 生成的二进制文件正确运行,并且在构建过程中似乎没有任何其他意外

    • 我使用,发现这一行来自该文件的三个地方: 但它不是js文件。

    • 问题内容: 我正在使用Go语言,回声框架进行开发。 我正在设计一个记录器,我想将线程ID的等价物记录到日志中,但是我不知道一个好的方法。 例如,如果同时进行多次访问的登录处理,则它在一侧成功,而在一侧失败。通过查看失败的日志无法确定。 经过检查,Go语言中的goroutine的id存在,但我不应该得到它,最初据说goroutine在同一线程中是不同的。 如何识别线程?还是有包装将它们放入日志中?

    • 跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。 以下是个典型的

    • 我有一个非常简单的scala应用程序。它所做的只是初始化记录器并logger.info(“你好”)。我在类路径中有一个log4j.properties文件,它具有以下设置 但是,当我尝试运行应用程序时。我得到的错误是log4j:WARN找不到记录器的appender(app.TestApp$)。log4j:警告请正确初始化log4j系统。 我错过了什么?但是,如果我有hadoop core,我会打