2013-09-17 1 views
0

Я использую Apache POI SXSSFWorkbook для создания таблицы Excel. Excel, но вместо ее загрузки мне нужно сохранить этот файл в blob. Я также нуждаюсь в этом, чтобы иметь возможность масштабирования, поэтому, если у меня есть 600 000+ записей, помещенных в файл, мне нужно избежать ошибки из памяти. Вот кодЛучший способ сохранить SXSSFWorkbook в blob?

SXSSFWorkbook workbook = new SXSSFWorkbook(100); 
addContent(); 

Обычно при выводе в файл, что я делаю что-то вроде

OutputStream output = response.getOutputStream(); 
workbook.write(output); 

Но в данном случае я не нужно идти в файл, только в сгусток на базе , за исключением того, что нет возможности сохранить SXSSFWorkbook в блобе. Я мог бы сохранить книгу в OutputStream и попытаться сохранить ее в blob, но обычно вам нужен inputStream. Есть ли утилита для преобразования outputStream в inputStream?

+2

не уверен, как blobs обрабатываются в спящем режиме, но по крайней мере стандартный blob api предоставляет вам [метод] (http://docs.oracle.com/javase/6/docs/api/java/sql/Blob .html # setBinaryStream (long)) – kiwiwings

+0

Почему бы не написать 'ByteArrayOutputStream', а затем вызвать' getBytes() 'и передать их в базу данных? – Gagravarr

+0

'ByteArrayOutputStream' помещает все в память, поэтому большие файлы могут не работать. – overflower

ответ

0

Для справки в будущем, я в конечном итоге помещаю его в файл, а затем читаю с него.

OutputStream output = new FileOutputStream(file); 
workbook.write(output); 
workbook.dispose(); 
output.flush(); 
output.close(); 

InputStream input = new FileInputStream(file); 
Blob blob = dao.saveInputStreamToBlob(input); 

затем в DAO, используя спящий режим сеанса в getLobHelper и создать блоб из InputStream. Производительность в порядке, я тестировал только 25 000 или около того записей, но проблем с памятью пока нет.

2

Используя советы от @kiwiwings У меня есть следующие работы:

Blob binario = Hibernate.getLobCreator(session).createBlob(new byte[0]); 
SXSSFWorkbook excel = ... 
excel.write(binario.setBinaryStream(0)); 

И это все.

 Смежные вопросы

  • Нет связанных вопросов^_^