Быстрый способ выполнения хранимых процедур MySQL в Java в нескольких потоках?

0

Какова самая быстрая возможность выдавать хранимые процедуры в потоковой среде Java? Согласно http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-preparecall Connection.prepareCall() - дорогой метод. Итак, что альтернатива называть его в каждом потоке, когда синхронизированный доступ к одному CallableStatement не является вариантом?

Теги:
stored-procedures

3 ответа

0

Немного подумав, кажется, что если у вас возникли проблемы с этим кодом инфраструктуры, ваши проблемы в другом месте. Большинство приложений не занимают слишком много времени, делая это. Убедитесь, что вы используете DataSource, большинство из них кэширование соединений, а некоторые даже кэшируют заявления.
Кроме того, для этого, чтобы быть шеей бутылки производительности, это означало бы, что вы делаете много запросов один за другим или что ваш пул соединений слишком мал. Возможно, вам нужно провести сравнительный анализ своего кода, чтобы узнать, сколько времени занимает хранимый процесс, и сколько времени занимает код JDBC.
Конечно, я буду следовать рекомендациям MySQL по использованию CallableStatement, я уверен, что они сравнили это. Большинство приложений ничего не разделяют между Threads, и это редко бывает проблемой.

0

В большинстве драйверов JDBC используется только один сокет для каждого соединения. Я думаю, что MySQL также использует один сокет. Это идея плохой производительности для совместного использования одного соединения между несколькими потоками.

Если вы используете множественное соединение между разными потоками, вам требуется CallableStatment для каждого соединения. Для каждого соединения необходим пул CallabaleStatement. Простейшим для объединения в этом случае является объединение класса соединения и делегирование всех вызовов первому классу. Это можно очень быстро создать с помощью Eclipse. В завернутом методе prepareCall() вы можете добавить простой пул. Вам также нужен обернутый класс CallableStatement. Метод close возвращает CallableStatement в пул.

Но сначала вы должны проверить, действительно ли вызов дорог, потому что во многих драйверах уже есть такой опрос внутри. Создайте цикл prepareCall() и close() и подсчитайте время.

0

Соединение не является потокобезопасным, поэтому вы не можете делиться им по потокам.

Когда вы готовитеCall, драйвер JDBC (может) сообщает системе РСУБД, что он выполняет большую работу, которая хранится на стороне сервера. Вы можете быть виновны в преждевременной оптимизации здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню