Мы используем JDBC + XMLRPC + Tomcat + MySQL для выполнения потенциально больших запросов MySQL. Какой способ лучше? - PullRequest
2 голосов
/ 08 ноября 2008

Я работаю над проектом на основе Java, в котором есть клиентская программа, которая должна подключаться к базе данных MySQL на удаленном сервере. Это было реализовано следующим образом:

Используйте JDBC для написания SQL-запросов, которые будут выполняться в виде сервлета с использованием Apache Tomcat и доступны через XML-RPC. Код клиента использует XML-RPC для удаленного выполнения этих функций на основе JDBC. Это позволяет нам сохранять нашу базу данных MySQL непубличной, ограничивает использование предопределенными функциями и позволяет Tomcat управлять транзакциями базы данных (что, как мне сказали, лучше, чем позволить MySQL делать это самостоятельно, но я действительно не понимаю почему). Однако этот подход требует большого количества стандартного кода, и Tomcat - это огромная проблема с памятью на нашем сервере.

Я ищу лучший способ сделать это. Один из способов, который я рассматриваю, - сделать базу данных MySQL общедоступной, переписать код на основе JDBC как хранимые процедуры и ограничить публичное использование только этими процедурами. Проблема, с которой я сталкиваюсь, заключается в том, что перевод всего кода JDBC в хранимые процедуры будет трудным и длительным. Я также не слишком знаком с разрешениями MySQL. Можно ли предоставить доступ к хранимой процедуре, которая выполняет операторы выбора для таблицы, но также запрещает произвольные операторы выбора для этой же таблицы?

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 ноября 2008

Я уверен, что вы могли бы реализовать свое решение без особых усилий, особенно используя что-то вроде удаленного взаимодействия Spring. Кроме того, сколько памяти ест Tomcat? Я искренне верю, что если он просто делает то, что вы описываете, он может работать менее чем за 128 МБ (консервативное предположение).

Ваша альтернатива - это «правильный по книге» способ решения проблемы. Я говорю, создайте прототип и посмотрите, как он работает. Основные проблемы, с которыми вы можете столкнуться:

  • MySQL имеет несколько важных моментов в этом отношении
  • MySQL поддерживает хранимые процедуры, будучи слишком примитивным и заставляя вас выполнять большую работу
  • Какой-то другой странный сбой

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

0 голосов
/ 08 ноября 2008

Вероятно, вы можете обновить ОЗУ на своем сервере дешевле, чем за несколько дней разработки, поэтому не пишите никакого кода, если это все, что вы получаете от этого упражнения. Кроме того, только то, что память используется внутри tomcat, не означает, что сам tomcat использует ее. Память может быть использована данными или техническими ошибками в вашем коде.

Если вы попробовали дополнительную оперативную память, и она израсходована, то это пахнет проблемой кодирования, поэтому я бы предложил использовать профилировщик или данные журнала, чтобы попытаться выяснить, в чем причина, прежде чем что-либо менять , Если причиной являются большие наборы данных, то непосредственное использование базы данных только отсрочит неизбежное, вместо этого вам нужно будет рассмотреть такие вещи, как разбиение на страницы, суммирование, кэширование на стороне клиента или редизайн клиентов, чтобы уменьшить использование дорогих запросов. Использование профилировщика или простой просмотр базы кода также скажет вам, если что-то создает слишком много объектов (особенно строк или узлов XML) или утечка памяти.

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

Наконец, я рискну, что есть много веских причин для размещения веб-уровня над вашей базой данных. Гибкость (развертывания), совместимость, контроль (над SQL) и безопасность - все это веские причины для сохранения веб-уровня.

0 голосов
/ 08 ноября 2008

MySQL 5.0.3+ имеет привилегию исполнения, которую вы можете установить (без установки привилегий выбора), которая должна позволить вам получить требуемую функциональность.

Тем не менее, обратите внимание на сообщение об ошибке mysql с JDBC (ну и многими другими драйверами).

При вызове [процедуры] с JDBC я получаю "java.sql.SQLException: требуется драйвер объявление процедуры, которое должно содержать либо \ nbegin, либо \ n для следования аргументу объявление или привилегия SELECT для mysql.proc для анализа типов столбцов. "

Обходной путь:

См. "NoAccessToProcedureBodies" в / J 5.0.3 для получения информации о несколько хакерских, не JDBC-совместимых обходной путь.

...