java - производительность jdbc - PullRequest
2 голосов
/ 18 января 2012

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

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

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

Спасибо, Aamer.

Ответы [ 4 ]

1 голос
/ 18 января 2012

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

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

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

0 голосов
/ 18 января 2012

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

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

0 голосов
/ 18 января 2012

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

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

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

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

0 голосов
/ 18 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...