代码之家  ›  专栏  ›  技术社区  ›  sumit Kumar Vivek Mitra

从查询中获取旧的时间戳

  •  1
  • sumit Kumar Vivek Mitra  · 技术社区  · 7 年前

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

    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
    }
    

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

    有人能指出我哪里出了问题,并提出解决问题的建议吗?

    感谢期待!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Laurenz Albe    7 年前

    now() 不返回墙时间,但返回事务开始时的当前时间戳。打电话 现在()) 在一个事务中重复地返回相同的值。参见 the documentation 更多信息。

    所以我怀疑如果 现在()) 返回旧时间。这是一个应用程序错误,因为长时间运行的事务将 VACUUM 从做它的工作,也锁定对象很长一段时间。

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