Как лениво извлекать большие объекты на сервере приложений Oracle Weblogic? - PullRequest
3 голосов
/ 08 августа 2011

Я запускаю приложение на сервере приложений Weblogic (10.3.3) в базе данных Oracle (10g и более поздние версии 11g), и кажется, что память моего приложения не управляется правильно, как после запуска его длянекоторое время он начинает неоднократно выдавать исключение «превышение лимита служебной нагрузки gc».

Я профилировал свой сервер с помощью jvisualvm, и оказалось, что большая часть кучи состоит из байтовых массивов, и эти байтовые массивы связаны с одним измои основные сущности в качестве члена данных (BLOB в БД).

Я пытался изменить эту сущность примерно так:

@Basic(fetch=LAZY)
@LOB
public byte[] getData() { return this.data; }

, но тогда я всегда получаю ноль.

Есть ли способ лениво выбрать мои большие объекты?

Обновление

Я использую поставщика по умолчанию, который поставляется с сервером приложений Weblogic.Я не трогал конфигурацию JPA на сервере.

В данный момент мой код очень прост (вроде песочницы), и он просто находит мою сущность, используя em.find() (в соответствии с идентификатором строки)и тогда я просто звоню myEntity.getData(), который возвращает ноль.

1 Ответ

1 голос
/ 14 августа 2011

Это снова я, у меня проблемы со входом в систему того же пользователя.В любом случае, нашел решение:

Я переключил провайдера JPA моего сервера на TopLink, но тогда лучшее, что я мог получить, - это не ленивая выборка (но по крайней мере без нуля или исключения).

Тогда я попробовал другой подход.Я создал новую сущность для той же таблицы, в которой хранится мое поле lob, тогда как предыдущая сущность содержала не поле lob, а новую сущность.Я связал их двоих отношениями один к одному и ленивым извлечением, и это сработало!

Мне потребовалось некоторое время, потому что работает только определенное отображение, как вы можете видеть здесь:

@Entity
@Table(name="MY_TABLE")
public class A implements Serializable {

    private Long id;
    private ALob lob;

    @Id
    public Long getId() {return id;}
    public void setId(Long id) {this.id = id;}

    @OneToOne(fetch=LAZY)
    @JoinColumn(name="ID", insertable=false, updatable=false)
    public ALob getLob() {return lob;}
    public void setLob(ALob lob) {this.lob = lob;}
}

@Entity
@Table(name="MY_TABLE")
public class ALob implements Serializable {

    private Long id;
    private byte[] data;

    @Id
    public Long getId() {return id;}
    public void setId(Long id) {this.id = id;}

    public byte[] getData() {return data;}
    public void setData(byte[] data) {this.data = data;}

}

Да, и кстати, это не работает с Kodo, только TopLink.

...