我正在使用在 32 位 Microsoft Windows XP(专业版 2002 Service Pack 3)上运行的 MySQL 5.6.11。我安装了 MySQL sys_exec
UDF。因为我在 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 服务器的连接
它无法重新连接,直到/除非系统本身重新启动。
也许,我稍后会考虑重新安装操作系统本身。