2017-01-19 5 views
1

У меня есть вопрос, хотелось бы получить помощь.
У меня есть запрос от Java.JBoss подготовил заявление слишком медленно

SELECT DISTINCT field1, field1 
from tblTableA WITH (NOLOCK) 
WHERE criteriaField='CONSTANT TEXT' 

я запускаю его с JPA

Query qry = entMgr.createNativeQuery(myQry) ; 
    List sqlResult = qry.getResultList() ; 

Теперь, что qry.getResultList() занимает слишком много времени для запуска - 75 или более секунд. Да, он возвращает около 700 000 записей, но тот же запрос запускается на Weblogic 10, используя ejb2 работает менее чем за 5 секунд

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

Есть что-то из-за использования jbosscmp-jdbc.xml. У меня нет этого в моей настройке, но выяснил, что есть функция ленивой загрузки, которую мы можем настроить. Теперь я не уверен, как сделать запрос, который я запускаю, настроить в XML-файле. Кроме того, может ли это использоваться с аннотациями вместо xml-файла?

+0

Попробуйте профилировать свой код, чтобы узнать, где потрачено время. – Andreas

+0

Время тратится на qry, getResultList() - у меня есть время распечатать до этого и после этого. Эта конкретная строка кода занимает слишком много времени для выполнения. –

+0

Но является ли это выполнение запроса, то есть ожидание базы данных или сортировка объектов Java, вот в чем проблема? Если это JBoss, как вы предполагаете, тогда профилирование обнаружит, где в коде JBoss проблема, и тогда вы можете лучше узнать, знают ли они об этом или сообщают, что она исправлена. – Andreas

ответ

1

Я хотел бы попробовать запустить этот запрос внутри нетранзакционного метода:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
List getResults(..){ 
    Query qry = entMgr.createNativeQuery(myQry) ; 
    return qry.getResultList() ; 
} 

Это иногда не допускается в зависимости от окружающей среды, и в основном используется для оптимизации запросов, планирующих иметь большие наборы результатов и который позже будет управляться PersistenceContext (так что в основном, когда вы будете использовать HQL вместо native)

Но я бы попробовал.

+0

Спасибо, Мацей. Я попробовал, и это не исправило :( –

1

Выполняется этот запрос выбора в пределах транзакции. Я нашел старый JIRA ticket на сайте Jboos. Как предполагает билет, есть потенциал вокруг flush. Если вы выполняете запрос с EJB3, выполняется или автоматически создается flush для всех объектов, которые вы извлекаете с помощью собственного запроса. Идея, похоже, не позволяет получить устаревшие объекты из базы данных. Но в вашем случае это неприменимо. Установите режим промывки на COMMIT и проверьте, улучшена ли производительность.

query.setFlushMode(FlushModeType.COMMIT);

также отключить журналирование гибернации и посмотреть, если это делает никакой разницы.

+0

Спасибо. К сожалению, это не улучшило время. Я переключил свой метод на использование чистой jdbc - инфраструктуры JPA/Hibernate. 4 секунды (по сравнению с 75+ с гибернацией) К сожалению, прибегая к простому старому jdbc, не соответствует цели проекта. Поэтому нам нужно найти причину, по которой требуется время. –

Смежные вопросы