2010-09-07 71 views
0

我使用的軟件棧是:tomcat->彈簧> 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.AbstractJ dbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271) org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) org.apache .commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.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.lis tIgnoreQueryCache(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)

的版本,我使用是:

  • Tomcat的6.0.26
  • 彈簧3
  • DBCP 1.4
  • PostgreSQL相關8.4-701.jdbc4.jar
  • PostgreSQL的版本:8.4.4-0ubuntu10.04

回答

1

timestamp out of range: "20120100-09-26 00:00:00.000000 -04:00:00"

你在20120100年工作? (二千萬)你確定嗎?時間戳的最大年份是294276,但我很確定您的輸入不正確。

這與concurrency無關,只是超出範圍輸入。

+0

這是奇怪的事情。我有一個jmeter測試,它使用時間戳查詢一些數據。如果用戶數少於20,那麼沒有問題。我開始增加用戶的數量,並不時出現問題。 – 2010-09-08 14:00:23

+0

然後問題可能出現在JMeter中:它使用無效數據,數據庫沒有別的選擇,只能拒絕查詢並拋出錯誤。 – 2010-09-08 14:19:41

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"); 
    } 
} 

DateFormatThreadLocal

+0

tks爲答案。代碼在一個方法內部運行,它只使用方法中聲明的變量。 – 2010-09-08 14:25:14

+0

看看p7spy - http://www.p6spy.com/ - 你可以將它設置爲一個代理JDBC驅動程序來記錄對數據庫運行的所有語句 - 應該幫助你確定導致問題的確切查詢,並且潛在地找到從哪裏調用的語句。 – 2010-09-08 17:51:16