Комментарии 11
PS — я писал подобный логгер, который видя в БД BLOB-типы, выплевывал в лог что-то типа substring(X, 1, 256), чтобы не зафлуживать лог, и только будучи сконфигурированным на отдачу полного блоба (для детальной отладки), отдавал весь. И в БД-методы, которые отдают блобы, всегда добавляю параметр, типа InfoOnly, получив который, процедура не тянет из базы блоб, а для совместимости по резалтсету выдает convert(varchar(max), NULL) — так как часто достаточно получить метаданные (имя файла, размер, пользователя, контрольную сумму массива), без вытаскивания самого блоба с пластин диска
И в БД-методы, которые отдают блобы, всегда добавляю параметр, типа InfoOnly, получив который, процедура не тянет из базы блоб, а для совместимости по резалтсету выдает convert(varchar(max), NULL) — так как часто достаточно получить метаданные (имя файла, размер, пользователя, контрольную сумму массива), без вытаскивания самого блоба с пластин диска
Любопытный подход, у вас СУБД "Оракл"?
Вот тоже, буквально на днях обнаружил с его помощью цепочку toArray->asList->toArray и так далее.
Я для таких случаев написал свой ByteStream. Пока размер буфера не превышает определенного порога, все пишется в byte[]. Как только данные выходят за эти пределы, то они сбрасываются во временный файл. Соответственно, метод getInputStream() в 1-м случае вернет ByteArrayInputStream, во 2-м — FileInputStream, обернутый в BufferedInputStream.
то они сбрасываются во временный файл
Не тормозит ли запись на диск?
Смотря с чем сравнивать. По сравнению с тем, как начинает тормозить вся JVM, когда не может найти непрерывную область памяти нужного размера, запись на диск просто летает. Потом, можно же эти файлы на каком-нибудь SSD или даже RAM-диске разместить.
По сравнению с тем, как начинает тормозить вся JVM, когда не может найти непрерывную область памяти нужного размера, запись на диск просто летает.
Согласен.
Потом, можно же эти файлы на каком-нибудь SSD или даже RAM-диске разместить.
А пробовали вместо файлов вне кучи память выделять? Например, писать байты в какой-нибудь direct ByteBuffer?
Мины под производительностью ждут своего часа: часть 2