【发布时间】:2015-04-24 07:31:11
【问题描述】:
我正在使用在 32 位 Microsoft Windows XP(专业版 2002 Service Pack 3)上运行的 MySQL 5.6.11。我安装了 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
此过程应该由数据库触发器调用(已充分完成),因此,当执行此存储过程时,它应该在所述 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.");
}
}
doGet() 方法中的System.out.println("PushCountry called."); 行在服务器终端上没有任何结果(因为它没有被执行/调用),当上述 MySQL 的东西付诸实践时。
使用 MySQL 执行此操作是否不切实际,是否还有其他我可能遗漏的东西,或者它是旧的 EOL 恐龙:Windows XP?
我使用的共享动态链接库可能不合适。请澄清,如果这种情况超出了我的范围。
编辑:
进入时,
mysql> SELECT sys_eval('id');
MySQL 终止/崩溃并报告 following 错误报告。
关闭此对话框后,MySQL 会留下以下错误消息。
ERROR 2013 (HY000): 查询期间丢失与 MySQL 服务器的连接
它无法重新连接,直到/除非系统本身重新启动。
也许,我稍后会考虑重新安装操作系统本身。
【问题讨论】:
-
sys_exec() 函数返回 1 如下,这是一个成功标志。 你确定吗?返回值似乎是进程的退出状态,任何非零都意味着错误——不是成功。如果您使用
sys_eval()函数,您会得到什么响应?也许是有用的错误消息? -
回复
SELECT sys_eval('id');有错误。突然出现一个弹窗提示:mysqld.exe has encountered a problem and needs to close. We are sorry for the inconvenience.关闭此对话框时,在命令行上提示此消息ERROR 2013 (HY000): Lost connection to MySQL server during query。 MySQL 永远停止工作,直到系统本身重新启动。 -
哎呀,服务器崩溃...好吧,这不是我想到的那种错误消息。
标签: mysql servlets curl mysql-udf