MySQL 事件调度

1、打开数据库连接、找到事件,右键点击新建事件

2、在定义中编写要执行的事件sql代码,在计划中设计事件调度执行的规律。

编写sql时要注意格式要求:

(1)开头要写BEGIN,结尾处写END

(2)每一个sql结束处需要打上分好,“;”,区分每一条sql语句,漏写时,事件无法保存

(3)事件示例

BEGIN

-- 推送当天门票预测数据
	DELETE FROM ylxs_dp.ylxs_jqpwfx_mpydqktj WHERE SUBSTR(sj,1,10) = (SUBSTR(NOW(),1,10));
	
	-- 添加今日数据
INSERT INTO ylxs_jqpwfx_mpydqktj (jr,jqmc,sj,jdmc,jrwj,jrjp,mr)
SELECT
	count(0) as jr,
	'玉龙雪山' as jqmc,
	orderTime as sj,
	scenicAreaName as jdmc,
	0 as jrwj,
	0 as jrjp,
	0 as mr
FROM
	ylxs_hldc.t_dm_ticket_data
	WHERE
	scenicAreaName in ('冰川公园索道','云杉坪索道','印象丽江','牦牛坪索道','玉龙雪山景区门票')
	and SUBSTR(orderTime,1,10) = (SUBSTR(NOW(),1,10))
	GROUP BY scenicAreaName;
	
INSERT INTO ylxs_jqpwfx_mpydqktj (jr,jqmc,sj,jdmc,jrwj,jrjp)
		SELECT
	count(0) as jr,
	'玉龙雪山' as jqmc,
	orderTime as sj,
	'玉龙雪山景区门票' as jdmc,
		0 as jrwj,
	0 as jrjp
FROM
	ylxs_hldc.t_dm_ticket_data
	WHERE
	scenicAreaName in ('冰川公园索道','云杉坪索道','印象丽江','牦牛坪索道','玉龙雪山景区门票')
	and SUBSTR(orderTime,1,10) = (SUBSTR(NOW(),1,10));
	
	-- 添加昨日数据
		UPDATE
	ylxs_jqpwfx_mpydqktj
	SET
	zr = 
	(SELECT 
		IFNULL(count(0),0) as sl
	FROM
	ylxs_hldc.t_dm_ticket_data
	WHERE
		scenicAreaName = '冰川公园索道'
	and SUBSTR(orderTime,1,10) = date_sub(SUBSTR(NOW(),1,10),interval 1 day)
	)
	WHERE SUBSTR(sj,1,10) = (SUBSTR(NOW(),1,10)) and jdmc = '冰川公园索道';
	
			UPDATE
	ylxs_jqpwfx_mpydqktj
	SET
	zr = 
	(SELECT 
		IFNULL(count(0),0) as sl
	FROM
	ylxs_hldc.t_dm_ticket_data
	WHERE
		scenicAreaName = '云杉坪索道'
	and SUBSTR(orderTime,1,10) = date_sub(SUBSTR(NOW(),1,10),interval 1 day)
	)
	WHERE SUBSTR(sj,1,10) = (SUBSTR(NOW(),1,10)) and jdmc = '云杉坪索道';
	
				UPDATE
	ylxs_jqpwfx_mpydqktj
	SET
	zr = 
	(SELECT 
		IFNULL(count(0),0) as sl
	FROM
	ylxs_hldc.t_dm_ticket_data
	WHERE
		scenicAreaName = '印象丽江'
	and SUBSTR(orderTime,1,10) = date_sub(SUBSTR(NOW(),1,10),interval 1 day)
	)
	WHERE SUBSTR(sj,1,10) = (SUBSTR(NOW(),1,10)) and jdmc = '印象丽江';
	
					UPDATE
	ylxs_jqpwfx_mpydqktj
	SET
	zr = 
	(SELECT 
		IFNULL(count(0),0) as sl
	FROM
	ylxs_hldc.t_dm_ticket_data
	WHERE
		scenicAreaName = '牦牛坪索道'
	and SUBSTR(orderTime,1,10) = date_sub(SUBSTR(NOW(),1,10),interval 1 day)
	)
	WHERE SUBSTR(sj,1,10) = (SUBSTR(NOW(),1,10)) and jdmc = '牦牛坪索道';
	
						UPDATE
	ylxs_jqpwfx_mpydqktj
	SET
	zr = 
	(		SELECT
	count(0) as sl
FROM
	ylxs_hldc.t_dm_ticket_data
	WHERE
	scenicAreaName in ('冰川公园索道','云杉坪索道','印象丽江','牦牛坪索道','玉龙雪山景区门票')
	and SUBSTR(orderTime,1,10) = date_sub(SUBSTR(NOW(),1,10),interval 1 day)
	)
	WHERE SUBSTR(sj,1,10) = (SUBSTR(NOW(),1,10)) and jdmc = '玉龙雪山景区门票';
	
	-- 添加玉龙雪山明日预测数据
							UPDATE
	ylxs_jqpwfx_mpydqktj
	SET
	mr = 
	(		SELECT
	tomorrow_max_value as sl
FROM
	hl_data_predict.kl_predict_data
	WHERE
	SUBSTR(create_date,1,10)  = SUBSTR(NOW(),1,10) ORDER BY SUBSTR(create_date,1,19) desc LIMIT 0,1
	)
	WHERE SUBSTR(sj,1,10) = SUBSTR(NOW(),1,10) and jdmc = '玉龙雪山景区门票';
	
	-- 添加今日检票数
	UPDATE ylxs_jqpwfx_mpydqktj 
SET jrjp = (
	SELECT
	SUM(jps) as jrjp
FROM
	ylxs_dp.ylxs_jqpwfx_jdjpsdqs
	WHERE
	SUBSTR(sj,1,10) = SUBSTR(NOW(),1,10)
	and jdmc = '玉龙雪山'
	and jrzr = '1'
	) 
WHERE
	SUBSTR( sj, 1, 10 ) = SUBSTR( NOW(), 1, 10 ) 
	AND jdmc = '玉龙雪山景区门票';
	
	-- 添加今日未检票数

UPDATE ylxs_jqpwfx_mpydqktj 
SET jrwj =  ABS((
SELECT 
COUNT(distinct touristCardNum) as sl
FROM 
ylxs_hldc.t_dm_ticket_data
WHERE
SUBSTR(travelTime,1,10) = SUBSTR(NOW(),1,10)
and scenicAreaName in ('冰川公园索道','云杉坪索道','印象丽江','牦牛坪索道','玉龙雪山景区门票')
	)-(	SELECT
	SUM(jps) as jrjp
FROM
	ylxs_dp.ylxs_jqpwfx_jdjpsdqs
	WHERE
	SUBSTR(sj,1,10) = SUBSTR(NOW(),1,10)
	and jdmc = '玉龙雪山'
	and jrzr = '1'
	))
WHERE
	SUBSTR( sj, 1, 10 ) = SUBSTR( NOW(), 1, 10 ) 
	AND jdmc = '玉龙雪山景区门票'; 
	
END

 (4)在计划中设置事件执行规律

 

 注意:一定要写事件开始时间,且要精确到秒钟,否则无法保存该事件

4、适用场景

1、对于某些需要实时更新的数据,我们可以针对业务需求,单独建立一张结果表,编写事件定时更新,而不需要在接口请求中,每次去获取原表的最新数据。

2、对于数据量特别大的表,哪怕加了索引,优化了sql,执行查询时间也严重偏长,我们可以以不同的时间维度分组,或者根据业务需求分租,定时推送到结果表中,同时,还可以设置数据库的读、取时间,来防止事件执行时间过长,数据库连接宕机

oracle.net.READ_TIMEOUT=30000

oracle.jdbc.ReadTimeout=30000

5、通过列表查看时间最近一次执行时间

6、查看事件是否开启

SHOW VARIABLES LIKE 'event_scheduler'
//开启命令-查询中运行
set global event_scheduler = on;

7、设置当前事件开启

SET GLOBAL event_scheduler = 1; 

8、好处

当我们把一些业务逻辑通过编写事件、搭建结果表、sql函数等方式放在sql中去实现后,业务代码中执行,可以一定程度上减少接口的响应时间,提升项目性能以及用户体验感。

 9、防止数据库连接池耗尽的超时时间设置

中文社区 (MOSC)

中间件 (MOSC)

0 Replies

Last updated on March 27, 2015

1 WebLogic Server自动回收使用超时的连接

WebLogic Server 数据源的配置项: Admin Console -> JDBC Data Source: Configuration: Connection Pool -> "Inactive Connection Timeout"

设置为大于0的秒数。WebLogic Server 将自动检测出使用时间过长的连接并强制收回, 输出警告信息到日志文件:BEA-001153: Forcibly releasing inactive connection. 占用时间过长的连接分为两种情形: 一是应用程序有bug, 没有调用javax.sql.Connection.close()归还连接, 另一种是长时间执行SQL一直没有完成。

2 设置 JDBC SQL Statement Timeout

WebLogic Server 数据源的配置项: Admin Console -> JDBC Data Source: Configuration: Connection Pool -> "Statement Timeout"

设置为大于0的秒数。当SQL语句执行时间过长, 超过这个时间时Oracle JDBC驱动程序会抛出java.sql.SQLException: ORA-01013: user requested cancel of current operation. 这个特性依赖于JDBC驱动程序如何实现java.sql.Statement.setQueryTimeout()方法。

3 JDBC driver Socket Timeout

WebLogic Server 数据源的配置项: Admin Console -> JDBC Data Source: Configuration: Connection Pool, 在"Properties"输入框输入属性名字和值,每行一个。例如 Oracle JDBC driver 支持的:

oracle.net.READ_TIMEOUT=30000

oracle.jdbc.ReadTimeout=30000

当 Socket 操作因为网络问题或者数据库服务器端没有回应导致超过这个时间, Oracle JDBC driver 会抛出 java.sql.SQLRecoverableException:To view full details, sign in with your My Oracle Support Community account.

Don't have a My Oracle Support

Community account? Click to get started!
 

10、MySQL获取当前日期是第几周

	set @d=SUBSTR(NOW(),1,10);

select (day(@d)+WEEKDAY(@d-interval day(@d) day)) div 7;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚几哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值