[25] Springboot использует EasyExcel и пул потоков для реализации многопоточного импорта данных Excel.
[25] Springboot использует EasyExcel и пул потоков для реализации многопоточного импорта данных Excel.

Когда компания развивается,Встречался с очень распространенным явлениемФункция импортапотребности,нуждатьсяИмпортировать файл Excel,Это напоминает мне АлибабуEasyExcelэтот удобный инструмент,Когда клиент сказал мне, что ему необходимо поддерживать импорт в больших объемах,Я думал об использованиинить Чи ЛайМногопоточностьимпортироватьданные Библиотека этой операции。В этой главе описана эта операция.。

Прежде всего, общий процесс примерно такой:

Эффект:


Реальный проект — это инфраструктура RPC, инкапсулированная компанией.,на этот разdemoНепосредственно использовать предыдущую интеграциюmybatis-plusизdemoписатьиз。

Первый взгляд наОглавлениеструктура

в картинкахЧасть выбора кадраЭто эта главануждатьсяИсправлятьприезжатьизиливновь созданный файл,Объясню по порядку позже,Описание ниже можно сравнить с названием класса на этой картинке.

Затем представьте подготовительную работу, которую необходимо выполнить в этой главе:

  • таблица базы данных
  • Исправить файл конфигурации приложения,Максимальный лимит загрузки файлов Исправлять tomcat (в противном случае файл Excel будет слишком большим),При загрузке будет сообщено об ошибке)
  • Включите функцию пакетной вставки mybatis-plus. Mybatis-plus по умолчанию имеет только одну функцию вставки (если ваш проект не использует ее, она вам не нужна. Просто в ней нет метода пакетной вставки). мое демо)
  • Создайте различные классы, необходимые для многопоточного интерфейса импорта Excel.

Оглавление

1. Подготовьте базу данных и файлы Excel.

2. Введите необходимые зависимости

3. Измените файл конфигурации и измените ограничение размера файла по умолчанию.

4. Включите функцию пакетного сохранения mybatis-plus.

5. Создайте необходимые классы инструментов.

6. Создайте коды для каждого уровня бизнеса

7. Создайте прослушиватель событий easyExcel.

8. Создайте собственный класс потока

9. Проверьте эффективность однопоточной и многопоточной обработки.


1. Подготовьте базу данных и файлы Excel.

Язык кода:javascript
копировать
CREATE TABLE `deadman` (
  `uid` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT «Первичный ключ»,
  `idCard` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'Идентификационный номер',
  `userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT «Имя умершего»,
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT «Пол умершего»,
  `age` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT «Возраст умершего»,
  `reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT «причина смерти»,
  `house` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT «Располагай уровни ада»,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;


2. Введите необходимые зависимости

В основномимпортироватьeasyExcelзадействованные зависимости,следующее:


3. Измените файл конфигурации и измените ограничение размера файла по умолчанию.

这个必须Исправлять,В противном случае вы не сможете получить доступ к заднему интерфейсу.,Сервер Tomcat по умолчанию ограничивает размер загружаемых файлов.

Язык кода:javascript
копировать
spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
Язык кода:javascript
копировать
server:
  tomcat:
    max-swallow-size: 100MB 

4. Включите функцию пакетного сохранения mybatis-plus.

Платформа rpc, интегрированная в эту демонстрацию, — Mybatis-plus.,Итак, я нашел способ сделать этоРеализовать пакетное сохранение,следующее:

1. Создайте новый класс SpiceSqlInjector.

PS: Обратите внимание на название категории в поле выбора.

2. Создайте класс интерфейса SpiceBaseMapper.

PS: Изначально уровень бизнес-интерфейса унаследовал BaseMapper. Здесь он наследует BaseMapper, а затем добавляет метод, как показано выше. Обратите внимание, что имя должно быть таким, иначе при вызове этого метода будет сообщено об ошибке.

3. Создайте слой Mapper, необходимый для бизнеса.

Наследуйте класс интерфейса, который вы только что настроили.

Исходя из этого, вы можете реализовать пакетную вставку, внедрив DeadManMapper и вызвав вышеуказанный метод.

следующее:


5. Создайте необходимые классы инструментов.

При импорте через EasyExcel некоторые типы данных могут не соответствовать входным параметрам. В этой демонстрации задействованы следующие классы инструментов.

1、MultipartFileToFileUtils

Преобразуйте входящий тип MultipartFile в тип File. Контроллер получает тип MultipartFile, а метод EasyExcel.read требует тип File.

2、SpringJobBeanFactory

Когда класс прослушивателя внедряется в Mappe, будет сообщен нулевой указатель. Используйте следующий класс инструмента для наследования ApplicationContextAware и получения объекта bean-компонента.


6. Создайте коды для каждого уровня бизнеса

1. Уровень контроллера

2. Сопоставление классов сущностей базы данных

Аннотации, связанные с мибатис-плюс, вы можете прочитать в предыдущей статье.

3. Класс сущности easyExcel

Индекс относится к номеру строки в таблице Excel, например

f3142fff64f14c3bb068db491dcb982f.png
f3142fff64f14c3bb068db491dcb982f.png

4. Сервисный уровень

5. Уровень класса реализации сервиса

Вышеупомянутый метод представляет собой многопоточный прослушиватель событий, а следующий метод — однопоточный. Мы сравним эти два метода позже.


7. Создайте прослушиватель событий easyExcel.

1. Однопоточный прослушиватель событий

Анализ: этот прослушиватель наследуется от класса AnalysisEventListener, а универсальный указан как класс объекта класса сущности, указанный в easyExcel выше. Переопределить два метода этого класса: ignore и doAfterAllAnalysed. вызова(): этот метод будет считывать данные, начиная со второй строки таблицы Excel. doAfterAllAnalysed(): этот метод будет выполнен после того, как вызов проанализирует все данные Excel, поэтому данные можно будет сохранить в этом классе.

На этом однопоточный импорт завершен. Мы, наконец, сравним и проверим эффективность двух прослушивателей, а теперь создадим многопоточный прослушиватель событий.

2. Многопоточный прослушиватель событий

Анализ: Два упомянутых выше метода также были переписаны. Обработка метода вызова остается неизменной, а обработка метода doAfterAllAnalysed изменяется. В этом методе созданная задача потока передается в пул потоков путем создания пула потоков, чтобы пул потоков мог выполнять многопоточные задачи. , тем самым реализуя многопоточное выполнение операций импорта. Процесс: создать пул потоков -> рассчитать данные, которые должен обработать каждый поток -> создать объект CountDownLatch (гарантируя, что каждый поток в конце концов вернется в основной поток) -> зациклить количество потоков и отправить задачи потока в пул потоков -> Выполните метод await объекта CountDownLatch, чтобы перевести текущий поток в состояние ожидания и дождаться уменьшения CountDownLatch. Когда он равен 1, текущий поток будет пробужден — «Каждый поток обрабатывает свои собственные данные и после обработки выполняет метод countDown объекта CountDownLatch, так что значение объекта CountDownLatch уменьшается на единицу —» Когда значение CountDownLatch равно 0 (что указывает на задачу потока класса пула потоков и выполнение завершено), выполнить код основного потока -> закрыть пул потоков


8. Создайте собственный класс потока

На этом шаге создается класс задачи потока, описанный выше.

Вы можете реализовать Callable или Runable или наследовать Thread. Здесь вы реализуете Runable и переопределяете метод run.

В соответствии с назначенным ему интервалом входящих данных после выборки данных в этом интервале с помощью метода subList выполните реализованный выше метод пакетной вставки для сохранения данных в базе данных. Чтобы предотвратить проблемы с кодом при выполнении метода coutDown, запишите этот код в файлfinally.

PS: Два метода CountDownLatch (countDown, await) используются вместе, чтобы гарантировать, что при выполнении кода каждого потока основной поток входит в ожидание, а затем возвращается в основной поток для выполнения после завершения каждой задачи потока.


9. Проверьте эффективность однопоточной и многопоточной обработки.

Написание однопоточного и многопоточного прослушивателей событий было завершено выше, и теперь мы приступим к тестированию эффективности обоих.

1. Используйте однопоточный прослушиватель событий

Результат: 100033 фрагмента данных, данные верные.

2. Используйте многопоточные прослушиватели событий

Результат: 100033 фрагмента данных, данные верные, действительно намного быстрее.


Я думаю, что те, у кого есть похожие сценарии простой многопоточной обработки, могут использовать эту демонстрацию, чтобы изменить ее. Если возникнут какие-либо проблемы, спасибо, что указали на них. Рисби.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose