Nano Hash - криптовалюты, майнинг, программирование

Java — производительность jdbc

Мне нужна помощь от вас, ребята, относительно оптимизации производительности JDBC. Один из наших pojo использует jdbc для подключения к базе данных оракула и извлечения записей. В основном записи представляют собой адреса электронной почты, на основе которых электронные письма будут отправляться пользователям. Проблема здесь в производительности. Этот процесс происходит каждые выходные, и количество записей очень велико, около 100 тысяч.

Спектакль идет очень медленно, и это нас очень беспокоит. Кажется, что только 1000 записей извлекаются из базы данных каждый 1 час, а это означает, что для завершения этого процесса потребуется 100 часов (что очень плохо). Пожалуйста помоги мне с этим.

Сервер базы данных и процесс Java находятся на двух разных удаленных серверах. Мы использовали rs_email.setFetchSize(1000);, надеясь, что это будет иметь какое-то значение, но не изменится вообще. Тот же запрос, выполняемый на сервере, занимает 0,35 секунды. Любое быстрое предложение будет большим подспорьем для нас.

Спасибо, Амер.


  • Когда вы говорите об удаленном сервере, вы на самом деле имеете в виду серверы, которые находятся далеко друг от друга (с точки зрения сетевой инфраструктуры), или вы просто имеете в виду, что это два отдельных сервера (в одном центре обработки данных)? Такого рода производительность не должна происходить в любом случае. Вы выполняете только один запрос? 18.01.2012
  • Пожалуйста, покажите нам запросы, которые здесь выполняются, и, возможно, какой-нибудь псевдокод процесса. Сейчас мы гадаем на проблемы. 18.01.2012
  • Вы уверены, что выборка - это медленная точка? Тот факт, что вы извлекаете только 1000 строк в час, поднимает красный флаг (для меня), что материал, обрабатывающий строки, является узким местом. 18.01.2012
  • Другая идея; Вы подключаетесь к базе данных для получения каждой строки? В общем, это плохая идея. 18.01.2012
  • Вы уверены, что проблема связана с получением почтовых адресов из базы данных, а не с, например, отправкой электронной почты? В прошлом я видел, как службам SMTP требовалось несколько секунд для отправки одного сообщения из-за различных проверок безопасности (происхождение, пункт назначения, черные списки, обратные проверки DNS, которые не удались или были медленными и т. д.). В вашем примере обработка одного сообщения занимает 3,6 секунды. Я бы скорее попытался обвинить отправку почты, чем базу данных. 18.01.2012

Ответы:


1

Сначала посмотрите на свои запросы. Проанализируйте их. Посмотрите, можно ли сделать SQL более эффективным (т. е. запрашивать у базы данных то, что вам нужно, а не то, что вам не нужно — большая разница). Также проверьте, есть ли индексы для каких-либо полей в предложениях where и join. Индексы имеют большое значение. Но это не могут быть просто какие-то индексы. Они должны быть хорошими индексами (т. е. поля, составляющие индекс, обеспечивают достаточную уникальность базы данных для правильного извлечения данных). Поработайте над этим со своим администратором баз данных. Ищите либо высокое время выполнения по отношению к базе данных, либо проверяйте запросы с высокой загрузкой ЦП (даже если запросы выполняются меньше секунды). Это то, что может убить вашу базу данных.

Также с точки зрения кода проверьте, открываете ли вы и закрываете ли вы свои соединения или используете ли вы их повторно. Тоже может иметь большое значение.

Это поможет опубликовать ваш код, запросы, макеты таблиц и любые индексы, которые у вас есть.

18.01.2012

2

Используйте log4jdbc, чтобы получить настоящий sql для получения одной записи. Затем проверьте скорость и спланируйте этот sql. Вам может понадобиться правильный индекс или даже дефрагментация базы данных.

18.01.2012

3

Не уверен насчет драйвера Oracle, но знаю, что драйвер MySQL поддерживает два разных метода получения результатов: «поток» и «подождите, пока вы не получите все это».

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

Режим потоковой передачи не позволяет вам перемещаться/прокручивать набор результатов так, как «нормальный»/«подождите, пока вы не получите все это»...

В любом случае, не уверен, что это поможет, но, возможно, стоит проверить.

18.01.2012
  • Кстати... убедитесь, что соединение использует сжатие. В тех случаях, когда вы не получаете результаты с одного и того же физического сервера, сжатие часто может дать значительный прирост производительности. 18.01.2012
  • есть множество других вещей, таких как кластеризация индексов, использование материализованных таблиц запросов, секционирование данных, но сначала я бы предпочел низко висящие фрукты. 18.01.2012

  • 4

    Мой ответ на ваш вопрос вкратце таков: 1. Проверьте сеть 2. Проверьте SQL 3. Проверьте код Java.

    Звучит очень медленно. Первое, что нужно проверить, это убедиться, что у вас медленная сеть. Вы можете сделать это довольно быстро, просто пропинговав сервер базы данных. Или запустите сервер базы данных на той же машине, что и ваш JVMM. Если это не сеть, получите план объяснения для вашего SQL и убедитесь, что вы не выполняете сканирование таблиц, когда вам это не нужно. Если дело не в сети и не в SQL, то пора проверить ваш Java-код. Делаете ли вы что-нибудь вроде блокировки, когда этого делать не следует?

    18.01.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..