Когда компания развивается,Встречался с очень распространенным явлениемФункция импортапотребности,нуждатьсяИмпортировать файл Excel,Это напоминает мне АлибабуEasyExcelэтот удобный инструмент,Когда клиент сказал мне, что ему необходимо поддерживать импорт в больших объемах,Я думал об использованиинить Чи ЛайМногопоточностьимпортироватьданные Библиотека этой операции。В этой главе описана эта операция.。
Прежде всего, общий процесс примерно такой:
Эффект:
Реальный проект — это инфраструктура RPC, инкапсулированная компанией.,на этот разdemoНепосредственно использовать предыдущую интеграциюmybatis-plusизdemoписатьиз。
Первый взгляд наОглавлениеструктура:
в картинкахЧасть выбора кадраЭто эта главануждатьсяИсправлятьприезжатьизиливновь созданный файл,Объясню по порядку позже,Описание ниже можно сравнить с названием класса на этой картинке.
Затем представьте подготовительную работу, которую необходимо выполнить в этой главе:
Оглавление
1. Подготовьте базу данных и файлы Excel.
2. Введите необходимые зависимости
3. Измените файл конфигурации и измените ограничение размера файла по умолчанию.
4. Включите функцию пакетного сохранения mybatis-plus.
5. Создайте необходимые классы инструментов.
6. Создайте коды для каждого уровня бизнеса
7. Создайте прослушиватель событий easyExcel.
8. Создайте собственный класс потока
9. Проверьте эффективность однопоточной и многопоточной обработки.
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;
В основномимпортироватьeasyExcelзадействованные зависимости,следующее:
这个必须Исправлять,В противном случае вы не сможете получить доступ к заднему интерфейсу.,Сервер Tomcat по умолчанию ограничивает размер загружаемых файлов.
spring:
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
server:
tomcat:
max-swallow-size: 100MB
Платформа rpc, интегрированная в эту демонстрацию, — Mybatis-plus.,Итак, я нашел способ сделать этоРеализовать пакетное сохранение,следующее:
1. Создайте новый класс SpiceSqlInjector.
PS: Обратите внимание на название категории в поле выбора.
2. Создайте класс интерфейса SpiceBaseMapper.
PS: Изначально уровень бизнес-интерфейса унаследовал BaseMapper. Здесь он наследует BaseMapper, а затем добавляет метод, как показано выше. Обратите внимание, что имя должно быть таким, иначе при вызове этого метода будет сообщено об ошибке.
3. Создайте слой Mapper, необходимый для бизнеса.
Наследуйте класс интерфейса, который вы только что настроили.
Исходя из этого, вы можете реализовать пакетную вставку, внедрив DeadManMapper и вызвав вышеуказанный метод.
следующее:
При импорте через EasyExcel некоторые типы данных могут не соответствовать входным параметрам. В этой демонстрации задействованы следующие классы инструментов.
1、MultipartFileToFileUtils
Преобразуйте входящий тип MultipartFile в тип File. Контроллер получает тип MultipartFile, а метод EasyExcel.read требует тип File.
2、SpringJobBeanFactory
Когда класс прослушивателя внедряется в Mappe, будет сообщен нулевой указатель. Используйте следующий класс инструмента для наследования ApplicationContextAware и получения объекта bean-компонента.
1. Уровень контроллера
2. Сопоставление классов сущностей базы данных
Аннотации, связанные с мибатис-плюс, вы можете прочитать в предыдущей статье.
3. Класс сущности easyExcel
Индекс относится к номеру строки в таблице Excel, например
4. Сервисный уровень
5. Уровень класса реализации сервиса
Вышеупомянутый метод представляет собой многопоточный прослушиватель событий, а следующий метод — однопоточный. Мы сравним эти два метода позже.
1. Однопоточный прослушиватель событий
Анализ: этот прослушиватель наследуется от класса AnalysisEventListener, а универсальный указан как класс объекта класса сущности, указанный в easyExcel выше. Переопределить два метода этого класса: ignore и doAfterAllAnalysed. вызова(): этот метод будет считывать данные, начиная со второй строки таблицы Excel. doAfterAllAnalysed(): этот метод будет выполнен после того, как вызов проанализирует все данные Excel, поэтому данные можно будет сохранить в этом классе.
На этом однопоточный импорт завершен. Мы, наконец, сравним и проверим эффективность двух прослушивателей, а теперь создадим многопоточный прослушиватель событий.
2. Многопоточный прослушиватель событий
Анализ: Два упомянутых выше метода также были переписаны. Обработка метода вызова остается неизменной, а обработка метода doAfterAllAnalysed изменяется. В этом методе созданная задача потока передается в пул потоков путем создания пула потоков, чтобы пул потоков мог выполнять многопоточные задачи. , тем самым реализуя многопоточное выполнение операций импорта. Процесс: создать пул потоков -> рассчитать данные, которые должен обработать каждый поток -> создать объект CountDownLatch (гарантируя, что каждый поток в конце концов вернется в основной поток) -> зациклить количество потоков и отправить задачи потока в пул потоков -> Выполните метод await объекта CountDownLatch, чтобы перевести текущий поток в состояние ожидания и дождаться уменьшения CountDownLatch. Когда он равен 1, текущий поток будет пробужден — «Каждый поток обрабатывает свои собственные данные и после обработки выполняет метод countDown объекта CountDownLatch, так что значение объекта CountDownLatch уменьшается на единицу —» Когда значение CountDownLatch равно 0 (что указывает на задачу потока класса пула потоков и выполнение завершено), выполнить код основного потока -> закрыть пул потоков
На этом шаге создается класс задачи потока, описанный выше.
Вы можете реализовать Callable или Runable или наследовать Thread. Здесь вы реализуете Runable и переопределяете метод run.
В соответствии с назначенным ему интервалом входящих данных после выборки данных в этом интервале с помощью метода subList выполните реализованный выше метод пакетной вставки для сохранения данных в базе данных. Чтобы предотвратить проблемы с кодом при выполнении метода coutDown, запишите этот код в файлfinally.
PS: Два метода CountDownLatch (countDown, await) используются вместе, чтобы гарантировать, что при выполнении кода каждого потока основной поток входит в ожидание, а затем возвращается в основной поток для выполнения после завершения каждой задачи потока.
Написание однопоточного и многопоточного прослушивателей событий было завершено выше, и теперь мы приступим к тестированию эффективности обоих.
1. Используйте однопоточный прослушиватель событий
Результат: 100033 фрагмента данных, данные верные.
2. Используйте многопоточные прослушиватели событий
Результат: 100033 фрагмента данных, данные верные, действительно намного быстрее.
Я думаю, что те, у кого есть похожие сценарии простой многопоточной обработки, могут использовать эту демонстрацию, чтобы изменить ее. Если возникнут какие-либо проблемы, спасибо, что указали на них. Рисби.