Что тормозит Hibernate / Oracle? - PullRequest
3 голосов
/ 29 мая 2019

У меня есть приложение Java, работающее на сервере Windows. Это приложение запрашивает базу данных Oracle 10 через Hibernate. У меня есть запрос, возвращающий коллекцию из 215 объектов с 6 строковыми полями в каждом. Чтобы вернуть их, требуется около 20 секунд (статистика получена из статистики гибернации)

Я получил обратно sql, сгенерированный hibernate, и запустил его через SQLPlus, получив от 300 до 500 мс времени выполнения.

Я запустил консоль H2 с драйвером ojdbc (тот же, что используется моим приложением) и подключился к моей базе данных (с того же компьютера, на котором запускалось мое приложение, чтобы избежать проблем с сетью), запустил sql, полученный из Hibernate несколько раз, я получил те же 300-500 мс времени выполнения, что и в SQLPlus, поэтому я полагаю, что моя проблема связана с Hibernate, но я не знаю, где искать.

База данных находится на другом сервере, но я получил пинг <1 мс к этому серверу, поэтому я не думаю, что сеть задействована. </p>

Моя конфигурация:

javax.persistence.jdbc.driver=oracle.jdbc.driver.OracleDriver
javax.persistence.jdbc.url=jdbc:oracle:thin:@xxxxx
javax.persistence.jdbc.user=xxxxx
javax.persistence.jdbc.password=xxxxx
hibernate.ejb.naming_strategy=org.nuiton.jpa.hibernate.OracleCompliantImprovedNamingStrategy
hibernate.dialect=xxxx.MyDialect

hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.use_sql_comments=false
hibernate.format_sql=true
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

hibernate.c3p0.min_size=3
hibernate.c3p0.max_size=5
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50

hibernate.generate_statistics = false

Стратегия именования: https://gitlab.nuiton.org/retired/nuiton-jpa/blob/develop/nuiton-jpa-hibernate/src/main/java/org/nuiton/jpa/hibernate/OracleCompliantImprovedNamingStrategy.java

Диалект:

public class MyDialect extends Oracle10gDialect {

    public MyDialect() {
        super();
        registerColumnType(Types.DOUBLE, "number");
    }

}

Мои сущности выглядят (с геттерами и сеттерами):

public abstract class AbstractJpaRequestedArticle extends AbstractJpaEntity implements Serializable {

    private static final long serialVersionUID = 7293079560062973232L;

    public static final String PROPERTY_ID = "id";

    public static final String PROPERTY_QUANTITY = "quantity";

    public static final String PROPERTY_PRIORITY = "priority";

    public static final String PROPERTY_ARTICLE = "article";

    public static final String PROPERTY_REQUESTED_LIST = "requestedList";

    public static final String PROPERTY_DESTINATION_LOCATION = "destinationLocation";

    @Id
    protected String id;

    protected double quantity;

    protected String priority;

    @ManyToOne
    protected Article article;

    @OneToOne
    protected RequestedList requestedList;

    @ManyToOne
    protected Location destinationLocation;

    @PrePersist
    public void prePersist() {
        if (this.id == null) {
            this.id = new JpaEntityIdFactoryResolver().newId(this);
        }
    }

    @Override
    public String getId() {
        return id;
    }

AbstractJpaEntity определяет только равно, хеш-код и значение по умолчанию toString

1 Ответ

0 голосов
/ 13 июня 2019

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

Как указал @AmitNaik, моя проблема возникла из-за размера выборки, который не был установлен, и поэтому использовал значение по умолчанию (10). Я попытался поставить другое значение в параметре гибернации без удачи. Похоже, что в моей версии Hibernate этот параметр не учитывается в моем entityManagerFactory (почему?). Поэтому мне пришлось установить размер выборки в моем конкретном запросе, и это решило мою проблему (сейчас у меня около 600 мс в моем тестовом примере). Как сказал @ john16384, теперь я должен исследовать свой SQL-запрос, но это уже другая история.

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