以下是使用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服务器与同一时区分离。
任何人都可以指出我哪里出错了并提出修复建议吗?
感谢您的期待!
答案 0 :(得分:0)
now()
不会返回挂起时间,而是返回事务开始时的当前时间戳。在一个事务中重复调用now()
将始终返回相同的值。有关详情,请参阅the documentation。
所以我怀疑如果now()
返回旧时,你有一个长时间运行的开放交易。这是一个应用程序错误,因为长时间运行的事务将使VACUUM
无法完成其工作并且还会长时间锁定对象。
要获取当前的待机时间,请使用功能clock_timestamp()
。