从查询中获取较旧的时间戳
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()
。
下面是我使用 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()
。