У меня есть программа, которая читает построчный текстовый файл, создает объект-сущность Hibernate из каждой строки и сохраняет их. У меня есть несколько таких текстовых файлов для обработки, каждый из которых имеет около 300 000 строк. Я обнаружил, что моя текущая реализация мучительно медленная, и мне интересно, могу ли я что-то сделать, чтобы улучшить ситуацию.
Мой основной метод обрабатывает текстовый файл построчно, например:
// read the file line by line
FileInputStream fileInputStream = new FileInputStream(new File(fileName));
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
int lineCount = 0;
String line = bufferedReader.readLine();
while (line != null)
{
// convert the line into an Observations object and persist it
convertAndPersistObservationsLine(line);
// if the number of lines we've processed has built up to the JDBC batch size then flush
// and clear the session in order to control the size of Hibernate's first level cache
lineCount++;
if (lineCount % JDBC_CACHE_SIZE == 0)
{
observationsDao.flush();
observationsDao.clear();
}
line = bufferedReader.readLine();
}
Метод convertAndPersistObservationsLine () просто разбивает текстовую строку на токены, создает новый объект сущности, заполняет поля сущности данными из токенов, а затем сохраняет объект с помощью DAO, которая вызывает метод Session.saveOrUpdate () Hibernate. Методы DAO flush () и clear () являются прямыми вызовами соответствующих методов Hibernate Session.
Для свойства Hibernate 'hibernate.use_second_level_cache' установлено значение false, а для свойства Hibernate 'hibernate.jdbc.batch_size' установлено значение 50, как и для константы Java JDBC_CACHE_SIZE.
Может ли кто-нибудь предложить более эффективный способ решения этой проблемы или какие-либо настройки, описанные выше, которые могут улучшить производительность этой программы пакетной загрузки?
Заранее спасибо за помощь.
- Джеймс