0

我使用的软件栈是:tomcat->spring->hibernate->DBCP->postgreSQL

我有一个查询,它使用“没有时区的时间戳”类型的列来搜索一些数据。

如果在单用户模式下测试应用程序,则没有问题。

我正在使用JMeter进行一些压力测试,并且可以看到有时查询失败。仅当多个用户同时访问应用程序(同一秒内超过 20 个)时,才能重现此情况。

错误类似于:

org.postgresql.util.PSQLException:错误:时间戳超出范围:“20120100-09-26 00:00:00.000000 -04:00:00”

org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl. java:257) org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery:AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java: 271)org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) java:208) org.hibernate.loader.Loader.getResultSet(Loader.java:1808)org.hibernate.loader.Loader.doQuery(Loader.java:697)org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)org.hibernate.loader.Loader.doList(Loader.java:2228) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) org.hibernate.loader.Loader.list(Loader.java:2120) org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401) org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361) org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) org.hibernate.impl.SessionImpl.list(SessionImpl.java:第1148章)Loader.doList(Loader.java:2228) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) org.hibernate.loader.Loader.list(Loader.java:2120) org.hibernate.loader.hql。 QueryLoader.list(QueryLoader.java:401) org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361) org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) org.hibernate。 impl.SessionImpl.list(SessionImpl.java:1148) org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67)Loader.doList(Loader.java:2228) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) org.hibernate.loader.Loader.list(Loader.java:2120) org.hibernate.loader.hql。 QueryLoader.list(QueryLoader.java:401) org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361) org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) org.hibernate。 impl.SessionImpl.list(SessionImpl.java:1148) org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67)HQLQueryPlan.performList(HQLQueryPlan.java:196) org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148) org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) org.hibernate.ejb.QueryImpl。 getResultList(QueryImpl.java:67)HQLQueryPlan.performList(HQLQueryPlan.java:196) org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148) org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) org.hibernate.ejb.QueryImpl。 getResultList(QueryImpl.java:67)

我正在使用的版本是:

  • Tomcat 6.0.26
  • 春天 3
  • DBCP 1.4
  • postgresql-8.4-701.jdbc4.jar
  • PostgreSQL 版本:8.4.4-0ubuntu10.04
4

2 回答 2

2

在您的 Java 代码中,您是否在任何地方都使用了 DateFormat 对象的非线程安全用法?奇怪而奇妙的日期错误通常源于此类问题?

private static final DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

变成

private static final ThreadLocal<DateFormat> fmt = new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    }
}

DateFormat , ThreadLocal

于 2010-09-08T08:18:19.197 回答
1

时间戳超出范围:“20120100-09-26 00:00:00.000000 -04:00:00”

您在 20120100 年工作?(两千万)你确定吗?时间戳的最大年份是 294276,但我很确定您的输入不正确。

这也与并发无关,只是超出范围的输入。

于 2010-09-08T03:50:49.857 回答