定时器每秒生成1000条数据,插入数据库表名为当天日期的表

先在数据库写个存储过程,生成表名为名称_当天日期格式的表,

在新建的数据库下选择函数右键选择过程,

BEGIN
DECLARE `@suffix` VARCHAR(15);  
DECLARE `@sqlstr` VARCHAR(2560);  
SET `@suffix` = DATE_FORMAT(CURDATE(),'%Y_%m_%d');  
SET @sqlstr = CONCAT(  
"CREATE TABLE device_",`@suffix`,"(
  `id` int(10) NOT NULL AUTO_INCREMENT ,
  `sn` varchar(20),
  `date` datetime,
  `metadata` mediumblob,
  `status` int(11),
   PRIMARY KEY (`id`)  
  ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;");
PREPARE stmt FROM @sqlstr;  
EXECUTE stmt;  
END

保存存储过程名为device_proc,当前页面的类型选项为 PROCEDURE然后运行,

刷新数据库就可以看见新建的表了。若要每天生成这样的一张表格,还需要写个事件。事件编写如下。

CREATE EVENT if not exists e_test 
          on schedule every 30 second 
          on completion preserve 
     do call  device_proc; 

接下来写个生成1000个随机数的类 每个数有12位,前3位为版本aa或者bb,

public class RandomSnGennerator {
    public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";


    public static  String randomString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(allChar.charAt(random.nextInt(allChar.length())));
        }
        return sb.toString();
    }

    public static String headstr() {
        String[] str = {"aa", "bb"};
        int random = (int) (Math.random() * 2);
        String headstr = str[random];
        return headstr;
    }

    public static ArrayList  getSN(){
        ArrayList  sn=new ArrayList();
        for(int i=0;i<1000;i++){
            String headstr = headstr();
            String bodystr = randomString(9);
            String devicestr = headstr + bodystr;
             sn.add(devicestr);
        }
        return  sn;
    }
}
接下来写个定时器 其中run方法里面每生成一条数据就往数据库表插入一条数据

run方法的重写在main方法外,

public class TimerUtil extends TimerTask {
    private static boolean isRunning = false;
    private ServletContext context = null;

    public TimerUtil() {
        super();
    }

    public TimerUtil(ServletContext context) {
        this.context = context;
    }

    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Timer timer = new Timer();
        TimerUtil task = new TimerUtil();
        timer.schedule(task, 0, 1000);//1s一次 ,间隔0
    }
    @Override
    public void run() {
        if (!isRunning) {
            context.log("开始执行任务");
            DateFormat sdf = new SimpleDateFormat("yyyy_MM_dd");
            String s = sdf.format(new Date());
            DateFormat sdfc = new SimpleDateFormat("yyyy_MM_dd HH:mm:ss");
            String[] str = {"0", "1", "2"};
            String a = null;
            String url = "jdbc:mysql://localhost:3306/balala?useUnicode=true&characterEncoding=utf-8";
            Connection conn = null;
            Statement stat = null;
            try {
                conn = DriverManager.getConnection(url, "xx", "oo");
                stat = conn.createStatement();
                ArrayList devicesn = RandomSnGennerator.getSN();
                for (int i = 0; i < 1000; i++) {
                    int random = (int) (Math.random() * 3);
                    String status = str[random];
                    a = (String)sn.get(i);
                    String sql = "insert into devicedata_" + s + " (devicesn,createdate,
                     status) values('" + a + "','" + sdfc.format(new Date()) 
                    + "','" + status + "')";
                    stat.executeUpdate(sql);
                }

                stat.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            isRunning =false;
            context.log("指定任务执行结束");
        } else {
             context.log("上次任务未执行结束");
        }
    }
}
可以向数据表每秒钟插入1000条数据后,还得写个web定时器,在web项目启动时,执行定时器,

package com.example.utills;

import java.util.Calendar;
import java.util.Date;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListener implements ServletContextListener{

    public ContextListener() {
    }

    private java.util.Timer timer = null;

    /**
     * 初始化定时器
     * web 程序运行时候自动加载
     */
    @Override
    public void contextInitialized(ServletContextEvent arg0) {

        /**
         * 设置一个定时器
         */
        timer = new java.util.Timer(true);

        arg0.getServletContext().log("定时器已启动");

        /**
         * 定时器到指定的时间时,执行某个操作(如某个类,或方法)
         */
        int period = 24 * 60 * 60 * 1000;
        //每天的date时刻执行task,每隔persion 时间重复执行
        timer.schedule(new TimerUtil(arg0.getServletContext()),0, 1000);
//        在 指定的date时刻执行task, 仅执行一次

        arg0.getServletContext().log("已经添加任务调度表");
    }

    /**
     * 销毁
     */
    @Override
    public void contextDestroyed(ServletContextEvent arg0){
        timer.cancel();
        arg0.getServletContext().log("定时器销毁");
    }
}
这个类里面定时器每秒执行,与上面 的定时器类配合

还需要在web.xml中写入配置监听

<listener>
  <listener-class>com.example.utills.ContextListener</listener-class>
</listener>

运行一下项目,控制台出现如下语句。

信息: 指定任务执行结束
十一月 21, 2017 2:59:21 下午 org.apache.catalina.core.ApplicationContext log
信息: 开始执行任务
十一月 21, 2017 2:59:22 下午 org.apache.catalina.core.ApplicationContext log
信息: 指定任务执行结束
十一月 21, 2017 2:59:22 下午 org.apache.catalina.core.ApplicationContext log
信息: 开始执行任务
十一月 21, 2017 2:59:24 下午 org.apache.catalina.core.ApplicationContext log
信息: 指定任务执行结束

至此结束,大功告成!
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,针对您的问题,可以使用Java中的TimerTimerTask类实现定时器功能,并结合JDBC连接SQL Server数据库,实现每分钟向数据库插入数据的功能。具体实现步骤如下: 1. 首先在Java项目中导入SQL Server JDBC驱动,以便连接数据库。 2. 在Java代码中创建定时任务类,在该类中实现每分钟插入数据的功能。具体代码如下: ``` import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.TimerTask; public class InsertDataTask extends TimerTask { // JDBC连接信息 private static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private static final String DB_URL = "jdbc:sqlserver://localhost:1433;DatabaseName=testdb"; private static final String USER = "root"; private static final String PASS = "password"; @Override public void run() { Connection conn = null; PreparedStatement stmt = null; try { // 注册JDBC驱动 Class.forName(JDBC_DRIVER); // 建立数据库连接 conn = DriverManager.getConnection(DB_URL, USER, PASS); // 插入数据 String sql = "INSERT INTO table_name (column1, column2, column3) VALUES (?, ?, ?)"; stmt = conn.prepareStatement(sql); stmt.setString(1, "value1"); stmt.setString(2, "value2"); stmt.setString(3, "value3"); stmt.executeUpdate(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } finally { try { if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 3. 在Java代码中创建定时器对象,并指定每分钟执行一次定时任务。具体代码如下: ``` import java.util.Timer; public class Main { public static void main(String[] args) { // 创建定时器对象 Timer timer = new Timer(); // 创建定时任务对象 InsertDataTask task = new InsertDataTask(); // 每分钟执行一次定时任务 timer.schedule(task, 0, 60 * 1000); } } ``` 4. 替换上述代码中的JDBC连接信息和插入数据的SQL语句,即可在IDEA中实现每分钟向SQL Server数据库插入数据的功能。 希望这些信息能帮到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值