2010-09-07 1 views
0

стек программного обеспечения я использую: tomcat-> весенне> hibernate-> ДБХП -> PostGreSQLпроблемы параллелизма с помощью пружины, ГСБД и Postgres

У меня есть запрос, поиск по некоторым данным с использованием колонки введите «временная метка без часового пояса».

Если приложение протестировано в однопользовательском режиме, проблем нет.

Я использую 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)

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

  • кот 6.0.26
  • пружина 3
  • ДБХП 1,4
  • -8.4-701.jdbc4.jar PostgreSQL
  • PostgreSQL Версия: 8.4.4-0ubuntu10.04

ответ

1

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

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

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

+0

, что это странно вещь. У меня есть тест jmeter, который запрашивает некоторые данные, используя метку времени. Если количество пользователей меньше 20, то проблем нет. Я начинаю увеличивать количество пользователей, и проблема возникает время от времени. –

+0

Тогда проблема может быть в JMeter: она использует недопустимые данные, у базы данных нет другого выбора, кроме как отклонить запрос и выкинуть ошибку. –

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

+0

tks для ответа. Код выполняется внутри метода и использует только переменные, объявленные в методе. –

+0

Взгляните на p7spy - http://www.p6spy.com/ - вы можете настроить его как прокси-драйвер JDBC для регистрации всех операторов, работающих с db, - должны помочь вам точно определить точный запрос, вызывающий проблему, и потенциально найти, откуда вызывается запрос. –