3

我正在使用在 32 位 Microsoft Windows XP(专业版 2002 Service Pack 3)上运行的 MySQL 5.6.11。我安装了 MySQL sys_execUDF。因为我在 32 位 Windows 上运行,所以我使用了这个lib_mysqludf_sys.dllC:\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

此过程应该由数据库触发器调用(已充分完成),因此,当此存储过程由触发器执行时,它应该在所述 URL 上引发 HTTP GET 请求,但不会在 URL 上引发 HTTP GET 请求在某个事件上。


在命令行上手动执行该过程也成功,如下所示。

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 Servlet,它应该按如下方式监听这个 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.");
    }
}

当上述 MySQL 的东西付诸实践时,方法中的行在服务器终端上什么也没有产生(因为它没有被执行/调用System.out.println("PushCountry called.");)。doGet()

使用 MySQL 执行此操作是否不切实际,是否还有其他我可能遗漏的东西,或者它是旧的 EOL 恐龙:Windows XP?


我使用的共享动态链接库可能不合适。请澄清,如果这种情况超出了我的范围。


编辑:

进入时,

mysql> SELECT sys_eval('id');

MySQL 终止/崩溃并出现以下错误报告。

在此处输入图像描述

关闭此对话框后,MySQL 会留下以下错误消息。

错误 2013 (HY000): 查询期间丢失与 MySQL 服务器的连接

它无法重新连接,直到/除非系统本身重新启动。

也许,我稍后会考虑重新安装操作系统本身。

4

1 回答 1

0

似乎'id'是Windows下不存在的Linux命令......无论如何,我在返回数字但没有启动进程的Windows下也遇到了sys_exec()的问题。有关信息,它在 linux 下运行良好。

于 2015-03-30T10:18:26.417 回答