ПРИЛОЖЕНИЕ И СРЕДА
Корпоративное приложение Java EE/JSF2.0/JPA, содержащее веб-модуль и модуль EJB. Я создаю PDF-документы, содержащие оцененные данные, запрашиваемые через JPA.
Я использую MySQL в качестве базы данных с двигателем MyISAM для всех таблиц. Поставщик JPA — это EclipseLink с кешем, установленным на ALL
. FetchType.EAGER
используется в отношениях.
ПОСЛЕ ЗАПУСКА NETBEANS PROFILER
Результаты 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
следует использовать как первичный ключ, но я не вижу в этом основной причины низкой производительности.
Меня интересуют предложения по оптимизации. Не стесняйтесь спрашивать, нужна ли вам дополнительная информация!
ИЗМЕНИТЬ См. мой ответ, обобщающий лучшие результаты
Заранее спасибо!