У меня есть класс сущности с именем SrcFile
, и один из его столбцов:
@NotNull
@Lob
private Byte[] data;
Это SrcFile
имеет отношение OneToOne с сущностью Report.
Из отчета.java:
@OneToOne
private SrcFile srcFile;
Сохранение сущности SrcFile
прекрасно работает.
srcFileHomeFacade.clearInstance();
SrcFile srcFile = srcFileHomeFacade.getInstance();
byte[] bArray = resource.getBytesForSource();
srcFile.setData(ReportFileResource.toObject(bArray));
System.out.println("````````````````srcFile data length: "+bArray.length);
srcFileHomeFacade.persist();
Проблема возникает, когда я настаиваю Report
.
Я делаю:
report.setSrcFile(srcFile);
reportHomeFacade.persist();
и работает хорошо, НО после многократного выполнения этого кода он становится все медленнее и медленнее (даже это вызывает ошибку служебной информации GC), и после нескольких часов исследования я обнаружил, что эта report.setSrcFile(srcFile)
является проблемой.
Каким-то образом отчет не любит ссылаться на такую сумму srcFile.data
...
Вы видите причину?
Если я прокомментирую report.setSrcFile
, все отлично работает (за исключением того, что SRCFILE_ID в таблице отчетов будет нулевым, но это только для тестирования). Обратите внимание, что длина данных составляет около 100.000.
Примечание : Если я не сохраняю никаких report
, а только srcFile
сущностей, у меня нет проблем.
UPDATE
«Работать медленнее и медленнее» объяснения: этот код вызывается для преобразования некоторых pcls в pdf, поэтому data
содержит исходный код pcl и каждый раз отличается. После преобразования около 100 pcls процесс идет все медленнее и медленнее, и с помощью виртуальной машины я обнаружил этот массив byte [], который занимает много МБ памяти. Опять же, это определенно не проблема с IO, а с этим setSrcFile в объекте отчета, VisualVM также указывает на это.