Много отчетов здесь. У меня есть некоторые результаты, и я все еще ищу хорошие ответы.
Я нашел несколько инструментов, которые помогают:
VisualVM (с BTrace или встроенной трассировкой) претендует на помощь в трассировке, но мне не удалось найти какой-либо инструмент, который показывает синхронизацию при вызовах методов.
YourKit считается полезным; Я попросил лицензию с открытым исходным кодом.
Самая полезная вещь, которую я нашел, - встроенная статистика Hibernate. Если вы установите
hibernate.generate_statistics true
в ваших свойствах вы можете отправить sessionFactory.getStatistics()
и просмотреть подробную статистику о том, какие объекты были сохранены и извлечены и что влияет на кэши. Я нашел один из ответов, которые мне нужны, в qeuryStatistics, который сообщает для каждого скомпилированного запроса, попадания и пропадания кэша, количество выполнений запроса, сколько строк было возвращено, а также среднее, максимальное и минимальное время выполнения. Эти сроки ясно показали, куда идет время.
Затем я немного прочитал о кешировании. Предложение Разенхи было правильным. [Сейчас я отмечу его ответ как правильный.] Я добавил hibernate.cache.use_query_cache true
в мои свойства и добавил query.setCacheable(true);
к большинству моих запросов. Я также добавил <cache usage="read-write"/>
к нескольким моим файлам .hbm.xml. Сейчас большая часть моей статистики показывает преобладание обращений к кешу, а производительность значительно выше.
Я все еще хотел бы, чтобы некоторые инструменты помогли мне отследить время выполнения, чтобы я мог атаковать наихудшие проблемы, а не самые очевидные, но это большая помощь. Возможно, один из приведенных выше инструментов трассировки окажется полезным.