SpringBoot定时任务(ClickHouse定时写入数据)

上篇文章介绍了Redis定时写入数据

本篇文章再介绍下clickHouse数据库的定时写入数据

跟redis定时任务一样 同样使用@Bean和@Scheduled注解 

@Bean
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。

SpringIOC 容器管理一个或者多个bean,这些bean都需要在@Configuration注解下进行创建,在一个方法上使用@Bean注解就表明这个方法需要交给Spring进行管理。

@Scheduled
需要在启动类添加@EnableScheduling,启用Spring的计划执行功能,这样可以在容器中的任何Spring管理的bean上检测@Scheduled注解,执行计划任务

//每天凌晨两点执行一次

@Scheduled(cron = "0 0 2 * * ?")

//每8秒执行一次

@Scheduled(cron = "*/8 * * * * ?")

在使用无定时任务需求 可直接在接口中调用导入方法 

@EnableAutoConfiguration
@Component
@Configuration
@Order(value = 2)
public class ScheduledTaskUtils {
    private static final Logger logger = LoggerFactory.getLogger(ClickHouseUtils.class);

    //启动初始化导入一次
    @Bean
    public void initTestClickHouse() {
        tenMinuteDataImport();
    }
 
    //每天凌晨两点自动导入数据
    @Scheduled(cron = "0 0 2 * * ?")
    public void tenMinuteDataImport() {
    List<Map<String, Object>> curve = new ArrayList<>();
    String sql = "select .. from table where ...";
    //查询数据
    curve = ClickHouseUtils.execSQL(sql);
    ...

    ClickHouseUtils.insert(curve);
    logger.warn("定时任务:" + intime + " 导入十分钟数据:" + curve.size() + "条");
    }
 
}

ClickHouseUtils

sql中字段和for循环字段顺序,数量,类型都要对应 大家根据sql调整

    /**
     * ClickHouse通用查询
     *
     */
    public synchronized static List<Map<String, Object>> execSQL(String sql) {
        Connection connection = null;
        Statement statement = null;
        ResultSet results = null;
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        try {
            long t = System.currentTimeMillis();
            connection = ClickHousePool.getConnection();
            logger.info("init clickhouse conn use time:" + (System.currentTimeMillis() - t));
            t = System.currentTimeMillis();
            statement = connection.createStatement();
            results = statement.executeQuery(sql);
            logger.info("exec clickhouse sql use time:" + (System.currentTimeMillis() - t));
            t = System.currentTimeMillis();
            ResultSetMetaData metaData = results.getMetaData();
            int count = metaData.getColumnCount();
            ResultSetMetaData rsmd = results.getMetaData();
            Map<String, Object> map = null;
            while (results.next()) {
                map = new HashMap<String, Object>();
                for (int i = 1; i <= count; i++) {
                    map.put(rsmd.getColumnName(i), results.getObject(rsmd.getColumnName(i)));
                }
                list.add(map);
            }
            logger.info("analysis clickhouse result use time:" + (System.currentTimeMillis() - t) + " data size:" + list.size());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ClickHousePool.close(connection, statement, results);
            return list;
        }
    }

    /**
     * ClickHouse插入数据
     *
     * @param values
     * @return
     */
    public static boolean insert(List<Map<String, Object>> values) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet results = null;
        boolean isSuccess = false;
        try {
            long t = System.currentTimeMillis();
            String sql = "insert into table" +
                    "(create_time, write_time, test1, test2)" +
                    " values(?,?,?,?)";
            connection = ClickHousePool.getConnection();
            statement = connection.prepareStatement(sql);
            //字段和类型需对应
            for (Map<String, Object> valuesMap : values) {
                statement.setString(1, valuesMap.get("createTime").toString());
                statement.setString(2, valuesMap.get("writeTime").toString());
                statement.setInt(3, Integer.parseInt(valuesMap.get("test1").toString()));
                statement.setDouble(4, Double.parseDouble(valuesMap.get("test2").toString()));
                boolean execute = statement.execute();
                if (execute) {
                    logger.info("定时任务:导入数据成功");
                } else {
                    logger.info("定时任务:导入数据失败");
                }
            }
            connection.commit();
            logger.info("insert clickhouse use time {}ms,data size {}条", (System.currentTimeMillis() - t), values.size());
            isSuccess = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ClickHousePool.close(connection, statement, results);
            return isSuccess;
        }
    }

最后大家通过需求更改sql

有遇到什么问题欢迎评论区讨论🤗

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SpringBoot定时任务可以通过使用@Scheduled注解来实现。首先,在启动类上添加@EnableScheduling注解,开启对定时任务的支持。然后,在任意一个被Spring管理的bean的方法上添加@Scheduled注解,指定任务的执行规则和时间间隔。这样,在应用启动后,定时任务会按照规定的时间间隔自动执行。 引用中提到,需要在启动类添加@EnableScheduling注解,并且在任意一个Spring管理的bean的方法上添加@Scheduled注解,来实现定时任务的执行。 下面是一个示例代码,演示了如何使用SpringBoot定时任务定时数据: ```java @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨执行一次任务 public void runDataTask() { // 这里是你的数据处理逻辑 // 可以调用其他方法或者服务来完成数据的跑批操作 // 例如:dataService.runDataBatch(); } } ``` 在上述示例代码中,使用@Scheduled注解来标识runDataTask方法为定时任务,cron参数指定了定时任务的执行规则。在这个例子中,定时任务每天凌晨0点执行一次。 通过这种方式,你可以在SpringBoot应用中轻松实现定时任务的执行,完成数据的跑批操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringBoot定时任务](https://blog.csdn.net/qingqingyyds/article/details/126627301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SpringBoot定时任务ClickHouse定时写入数据)](https://blog.csdn.net/weixin_56567361/article/details/127012713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夜の雨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值