Вызов HTTP GET-запроса через MySQL путем выполнения команд собственной операционной системы, таких как curl

Я использую MySQL 5.6.11 под управлением 32-разрядной версии Microsoft Windows XP (профессиональная версия 2002 с пакетом обновления 3). Я установил MySQL sys_exec UDF. Так как я работаю в 32-битной Windows, я использовал этот lib_mysqludf_sys.dll (находится под C:\Program Files\MySQL\MySQL Server 5.6\lib\plugin\ так как это установка по умолчанию).

После этого была выполнена следующая команда (после входа в уже созданную базу данных).

mysql> CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.dll';
Query OK, 0 rows affected (0.02 sec)

Я уже создал хранимую процедуру PL/SQL следующим образом.

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `country_push`()
BEGIN 
    SET @result=sys_exec('curl http://localhost:8080/ContextPath/push-update-country'); 
END

Предполагается, что эта процедура вызывается триггерами базы данных (что выполняется надлежащим образом), и, соответственно, она должна вызывать HTTP-запрос GET по указанному URL-адресу, но HTTP-запрос GET не вызывается по URL-адресу, когда эта хранимая процедура выполняется триггером. на определенное событие.


Выполнение процедуры в командной строке вручную также выполняется успешно, как описано ниже.

mysql> CALL country_push();
Query OK, 0 rows affected (0.08 sec)

sys_exec() функция возвращает 1 следующим образом, который является флагом успеха.

mysql> SELECT sys_exec('curl http://localhost:8080/ContextPath/push-update-country')
AS result;
+--------+
| result |
+--------+
|      1 |
+--------+
1 row in set (0.06 sec)

На сервере приложений GlassFish (4.1) уже работает Java-сервлет, который должен прослушивать этот HTTP-запрос GET следующим образом.

@WebServlet(name = "PushCountry", urlPatterns = {"/push-update-country"})
public class PushCountry extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("PushCountry called.");
    }
}

Линия System.out.println("PushCountry called."); в doGet() Метод не производит ничего на серверном терминале (потому что он не выполняется / не вызывается), когда вышеупомянутый материал MySQL применяется на практике.

Разве это не практично делать с использованием MySQL, я могу что-то упустить, или это старый EOL-динозавр: Windows XP?


Общая библиотека динамических ссылок, которую я использую, может не подойти. Пожалуйста, уточните, если это так, это не по мне.


РЕДАКТИРОВАТЬ:

При входе,

mysql> SELECT sys_eval('id');

MySQL завершает работу / вылетает со следующим сообщением об ошибке.

При закрытии этого диалога MySQL оставляет следующее сообщение об ошибке.

ОШИБКА 2013 (HY000): потеря соединения с сервером MySQL во время запроса

Не удается восстановить соединение, пока / или сама система не будет перезагружена.

Возможно, позже я подумаю о переустановке самой операционной системы.

1 ответ

Кажется, что 'id' - это команда Linux, не существующая под Windows... в любом случае, у меня также возникают проблемы с sys_exec() под окнами, которые возвращают число, но процесс не запускается. Для информации это хорошо работает под Linux.

Другие вопросы по тегам