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

标签 java spring postgresql hibernate postgresql-9.4

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

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

此方法从数据库返回当前时间戳,但有时此方法从数据库返回旧时间戳。 (有时 30 秒到 1 分钟)

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

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

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

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

感谢期待!

最佳答案

now() 返回的不是挂钟时间,而是交易开始时的当前时间戳。在一个事务中重复调用 now() 将始终返回相同的值。参见 the documentation了解更多。

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

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

关于java - 从查询中获取较旧的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50903523/

相关文章:

java - SnapHelper 项目位置

spring - 如何更新/删除 Spring Security 中所有主体的角色

sql - PostgreSQL 中第一次出现空格时分割字符串?

sql - SQL中的匹配算法

Java字符串包含

java - VLCJ 中的流式桌面

java - 通过 java.lang.Object 检测数组

spring - J2SE中 "shutdown" Spring 上下文的正确方法

java - Spring 批量编写器

node.js - 仅当 active = true 时 Sequelize ORM 包含模型