Проблема параллелизма с использованием spring, dbcp и postgres - PullRequest
0 голосов
/ 08 сентября 2010

Стек программного обеспечения, который я использую: 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.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.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)

Версии, которые я использую:

  • кот 6.0.26
  • пружина 3
  • DBCP 1.4
  • PostgreSQL-8.4-701.jdbc4.jar
  • PostgreSQL версия: 8.4.4-0ubuntu10.04

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

В вашем 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

1 голос
/ 08 сентября 2010

отметка времени вне диапазона: "20120100-09-26 00: 00: 00.000000 -04: 00: 00"

Вы работаете в 20120100 году?(двадцать миллионов) Ты уверен?Максимальный год для отметки времени - 294276, но я почти уверен, что ваш ввод неверен.

Это также не имеет ничего общего с параллелизмом, просто вне диапазона ввода.

...