定时执行存储过程

 

存储过程学习:http://www.111cn.net/tags.php/mysql%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B/

#查看event是否开启


mysql> show variables like '%sche%';

+---------------------------------------------------+---------+

| Variable_name                                     | Value   |

+---------------------------------------------------+---------+

| event_scheduler                                   | OFF     |

| performance_schema                                | OFF     |

| performance_schema_events_waits_history_long_size | 10000   |

| performance_schema_events_waits_history_size      | 10      |

| performance_schema_max_cond_classes               | 80      |

| performance_schema_max_cond_instances             | 1000    |

| performance_schema_max_file_classes               | 50      |

| performance_schema_max_file_handles               | 32768   |

| performance_schema_max_file_instances             | 10000   |

| performance_schema_max_mutex_classes              | 200     |

| performance_schema_max_mutex_instances            | 1000000 |

| performance_schema_max_rwlock_classes             | 30      |

| performance_schema_max_rwlock_instances           | 1000000 |

| performance_schema_max_table_handles              | 100000  |

| performance_schema_max_table_instances            | 50000   |

| performance_schema_max_thread_classes             | 50      |

| performance_schema_max_thread_instances           | 1000    |

+---------------------------------------------------+---------+

17 rows in set (0.00 sec)


#将事件计划开启


mysql>  set global event_scheduler = on;

Query OK, 0 rows affected (0.00 sec)


#创建表


mysql> create table test(

    -> id int primary key auto_increment,

    -> endtime timestamp default CURRENT_TIMESTAMP not null

    -> );

Query OK, 0 rows affected (0.03 sec)


#插入数据


mysql> insert into test values(null,null);

Query OK, 1 row affected (0.00 sec)


#查询数据是否插入


mysql> select * from test;

+----+---------------------+

| id | endtime             |

+----+---------------------+

|  1 | 2011-01-03 16:57:00 |

+----+---------------------+

1 row in set (0.00 sec)


#创建存储过程


mysql> delimiter //  


mysql> create procedure test_proc()


    -> begin


    -> update test set endtime=CURRENT_TIMESTAMP where id=1;


    -> end;


    -> //


#恢复分隔符为';'


mysql> delimiter ;


#创建event test_event,每隔30秒将执行存储过程test_proc,将当前时间更新到test表中id=1的记录的endtime字段中去.


create event if not exists test_event 

on schedule every 30 second 

on completion preserve

do call test_proc();


#一会儿后首次查看数据


mysql> select * from test;

+----+---------------------+

| id | endtime             |

+----+---------------------+

|  1 | 2011-01-03 17:00:19 |

+----+---------------------+

1 row in set (0.00 sec)


# 一分钟到一分半钟之内再次查看数据


mysql> select * from test;

+----+---------------------+

| id | endtime             |

+----+---------------------+

|  1 | 2011-01-03 17:01:19 |

+----+---------------------+


#这看看起来就像数据库中的触发器的作用很相似吧

-- 现在关闭事件任务


mysql> alter event test_event ON

    -> COMPLETION PRESERVE DISABLE;

Query OK, 0 rows affected (0.00 sec)


#select查看数据后,再过30秒后再查看数据,发现数据不再改变了

-- 事件的开启


mysql> alter event test_event ON

    -> COMPLETION PRESERVE ENABLE;

Query OK, 0 rows affected (0.00 sec)


#将事件计划关闭

 

mysql> set global event_scheduler = off;

Query OK, 0 rows affected (0.00 sec)


 

/*

注意到了么,这里还包含了三种mysql注释

从‘#’字符从行尾。

从/*序列到后面的*/序列

从‘-- ’序列到行尾。请注意‘-- ’(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。

*/

 

以下是Java定时执行存储过程的示例代码: ```java import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledTask { private static final String DB_URL = "jdbc:mysql://localhost:3306/test"; private static final String USER = "root"; private static final String PASSWORD = "123456"; private static final String CALL_PROCEDURE_SQL = "{call procedure_name()}"; public static void main(String[] args) { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); executorService.scheduleAtFixedRate(() -> { Connection conn = null; CallableStatement stmt = null; try { conn = DriverManager.getConnection(DB_URL, USER, PASSWORD); stmt = conn.prepareCall(CALL_PROCEDURE_SQL); stmt.execute(); } catch (SQLException e) { // 处理异常 } finally { try { if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { // 处理异常 } } }, 0, 1, TimeUnit.HOURS); } } ``` 该示例代码使用了Java的ScheduledExecutorService类来定时执行存储过程。在main方法中,我们创建了一个ScheduledExecutorService实例,并使用scheduleAtFixedRate方法来定时执行一个Runnable任务。在该任务中,我们获取数据库连接,准备调用存储过程的CallableStatement对象,并执行该对象的execute方法来执行存储过程。最后,我们在finally块中关闭了CallableStatement和Connection对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值