从查询中获取较旧的时间戳

Getting Older timestamp from query

下面是我使用 select 查询获取当前数据库时间的方法。

public Date getDBDateTime() { 
    Session session = sessionFactory.getCurrentSession();   
    return (Date) session.createSQLQuery("select now() as date").uniqueResult();    
}

此方法 returns 来自数据库的当前时间戳,但偶尔此方法 returns 来自数据库的旧时间戳。 (有时 30 秒到 1 分钟)

这是我在spring中的服务层方法,它调用了上面的dao方法。

@Transactional
public void doSomething(){
   Date now  = dao.getDBDateTime();
   //service specific logic
}

需要 select 数据库时间用于某些事件计时计算,并使数据库和应用程序服务器与同一时区分离。

任何人都可以指出我哪里出错了以及解决问题的建议吗?

感谢期待!

now() 不是 return wall time,而是交易开始时的当前时间戳。在一个事务中重复调用 now() 将始终 return 相同的值。有关更多信息,请参阅 the documentation

所以我怀疑如果 now() return 是旧时,您有一个很长的 运行 未结交易。这是一个应用程序错误,因为长 运行 事务将使 VACUUM 无法完成其工作,并且还会长时间锁定对象。

要获取当前挂钟时间,请使用函数clock_timestamp()