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

时间:2018-06-18 06:11:15

标签: java spring postgresql hibernate postgresql-9.4

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

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

此方法返回数据库中的当前时间戳,但偶尔此方法会从db返回较旧的时间戳。 (有时30s到1分钟)

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

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

需要为某些事件计时计算选择db time,并让db和app服务器与同一时区分离。

任何人都可以指出我哪里出错了并提出修复建议吗?

感谢您的期待!

1 个答案:

答案 0 :(得分:0)

now()不会返回挂起时间,而是返回事务开始时的当前时间戳。在一个事务中重复调用now()将始终返回相同的值。有关详情,请参阅the documentation

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

要获取当前的待机时间,请使用功能clock_timestamp()