ПРИМЕНЕНИЕ и ОКРУЖАЮЩАЯ СРЕДА
Корпоративное приложение Java EE / JSF2.0 / JPA, которое содержит веб-модуль и модуль EJB. Я создаю PDF-документы, которые содержат оценочные данные, запрошенные через JPA.
Я использую MySQL в качестве базы данных, с движком MyISAM для всех таблиц. JPA-провайдер - EclipseLink с кэшем, установленным на ALL
. FetchType.EAGER
используется в отношениях.
ПОСЛЕ РАБОТЫ ПРОФИЛЯТОР NETBEANS
Результаты Profiler показывают, что следующий метод вызывается чаще всего. В этом сеансе было 3858 вызовов с ~ 80 секундами от запроса до ответа. Это занимает 80% процессорного времени. В таблице Question
680 записей.
public Question getQuestionByAzon(String azon) {
try {
return (Question) em.createQuery("SELECT q FROM Question q WHERE q.azonosito=:a").setParameter("a", azon).getSingleResult();
} catch (NoResultException e) {
return null;
}
}
Сущность Question
:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Question implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true)
private String azonosito;
@Column(nullable = false)
@Basic(optional = false)
private String label;
@Lob
@Column(columnDefinition = "TEXT")
private String help;
private int quizNumber;
private String type;
@ManyToOne
private Category parentQuestion;
...
//getters and setters, equals() and hashCode() function implementations
}
Есть четыре сущности, расширяющие Question
.
Столбец azonosito
должен использоваться в качестве первичного ключа, но я не вижу в этом основной причины низкой производительности.
Меня интересуют предложения по оптимизации. Не стесняйтесь спрашивать, если вам нужна дополнительная информация!
РЕДАКТИРОВАТЬ Смотрите мой ответ, суммируя лучшие результаты
Заранее спасибо!