получить неверный результат из Hibernate \ Oracle - PullRequest
2 голосов
/ 21 июня 2011

Tomcat: 5,5
Oracle: 11G (11.1.0.7.4)
JDK: 1,6
Спящий режим: 3.0,5

Контекст
Мы используем Hibernate, чтобы получить количество строк в представлении.Представление написано так, что оно всегда получит хотя бы одну строку.В базе данных достаточно строк для представления, чтобы вернуть 8 строк.

Проблема
Время от времени мы получаем значение НОЛЬ

Еслимы пытаемся снова (т. е. пользователь обновляет экран), возвращается правильный счет 8.

Расследование
Мы пытались сделать несколько вещей, чтобы исключить следующее

1) сервер Oracle возвращает неверный результат
2) проверил представление, чтобы убедиться, что оно хорошее, т.е. вернет правильный результат

Теперь подозрение поворачивается в сторону Hibernate

Фрагмент кода
Можете ли вы найти что-нибудь подозрительное в приведенном ниже коде?

public static int getRowCount( Criteria criteria )
{
    int totalRows = 0;
    criteria.setProjection( Projections.rowCount() );
    Integer count = ( Integer ) criteria.uniqueResult();

    if ( count != null )
        totalRows = count.intValue();

    criteria.setProjection( null );
    criteria.setResultTransformer( Criteria.ROOT_ENTITY );

    return totalRows;
}

Мы также убедились, что счетчик равен нулю, а не нулю
Как это ни странно звучит,публикуются дефекты Oracle, в которых возвращаются неверные результаты, и, кроме того, эта ошибка стала возникать, когда мы применили оперативное исправление Oracle.

Вопрос
Кто-нибудь думает, что возможно, что Oracle может вернуть incorrec?
Любое предложение о том, как решить эту проблему, также будет оценено ...

Краткое изложение некоторых ключевых фактов
- Это произошло примерно в то же время, когда мыобновил Oracle11G с 11.1.0.6.1 до 11.1.0.7.4 и сделал несколько исправлений.
- Это было единственное изменение, произошедшее с экосистемой за этот период времени - Изменения в Oracle
- Это происходит непоследовательно.Теперь вы видите проблему. Теперь нет.
- Нечасто.Но достаточно серьезный, чтобы вызвать тревогу.

Ответы [ 4 ]

1 голос
/ 22 июня 2011

v $ sql покажет SQL, сколько раз он был выполнен и количество обработанных строк.

Существует возможность ошибки Oracle - как правило, в очень сложных запросах, но также в целом согласованно для данного набора данных.

NO_DATA_FOUND могут вызывать исключения из процедур и функций PL / SQL, которые часто представляются клиенту в виде пустого набора результатов. Без более подробной информации о представлении, таблицах и связанном коде ... это все догадки

1 голос
/ 21 июня 2011

Первое, что я хотел бы сделать, это включить ведение журнала запросов Hibernate. Это точно скажет вам, какой SQL отправляется в Oracle. Затем вы можете запустить этот точный SQL и посмотреть, что вы получите.

Вы можете включить ведение журнала запросов одним из следующих способов:

0 голосов
/ 23 июня 2011

Мои два цента: У вас высокопроизводительная СУБД Oracle. Зачем обращаться с ним как с дешевым арендованным мулом или базой данных MySql, добавляя его в Hibernate?

Для изучения Oracle PL / SQL и JDBC требуется столько же усилий, сколько и для изучения Hibernate и всех его особенностей. И разница в производительности просто потрясающая ...

0 голосов
/ 21 июня 2011

Я очень сомневаюсь, что Oracle не может правильно рассчитать. Хороший шанс, что что-то еще происходит. Вот возможность (которую я видел на циновках). Если кто-то выполняет полное обновление (atomic_refresh => false для mview), то это похоже на выполнение усечения + вставки.

Если во время этого обновления вы выбираете количество, угадайте, что, счет будет = 0.

Просто предположение о том, что здесь может происходить. Как администраторы баз данных, чтобы контролировать это представление и убедиться, что обновление не происходит, пока вы выбираете счетчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...