B079-项目实战--支付模块 定时任务 项目总结

目录

      • 概述
      • 示例
        • jar包
        • 配置类
        • 任务详情
      • 项目应用
        • 封装的工具类QuartzUtils
        • 封装IQuartzSrvice和QuartzServiceImpl
        • 封装参数QuartzJobInfo
        • 编写任务逻辑MainJob
        • 调用第三方支付前添加定时任务
        • 异步回调后移除定时任务
      • 订单支付整体流程

概述

优势:Tmer不支持持久化,重启需要重新安排,Quartz可以持久化,满足大部分需要
缺点:高并发情况下,大量定时任务存在会影响性能。

jvm默认大小500m,定时任务对象太多会内存溢出宕机,该方案只能在1000并发以下比较适合。正常来说我们就满足,只有秒杀,抢单等。。。
高并发情况下要换用消息队列。

原理图
在这里插入图片描述

示例

jar包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

配置类

添加定时任务的配置类 - 交给spring容器管理就自动会跑起来

@Configuration
public class QuartzConfig {@Beanpublic JobDetail newJob(){return JobBuilder.newJob(PrintTimeJob.class)//PrintTimeJob我们的业务类.withIdentity("9527")//可以给该JobDetail起一个id//每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取.usingJobData("msg", "Hello Quartz")//关联键值对.storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail.build();}@Beanpublic Trigger printTimeJobTrigger() {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ? ");return TriggerBuilder.newTrigger().forJob(newJob())//关联上述的JobDetail.withIdentity("quartzTaskService")//给Trigger起个名字.withSchedule(cronScheduleBuilder).build();}
}

任务详情

/*** 定时任务业务处理类,我们继承QuartzJobBean* 重写executeInternal方法来实现具体的定时业务逻辑*/
public class PrintTimeJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {//获取JobDetail中关联的数据String msg = (String) context.getJobDetail().getJobDataMap().get("msg");System.out.println("current time :"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "---" + msg);}
}

项目应用

封装的工具类QuartzUtils

import org.quartz.*;import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;/*** Quartz调度管理器*/
public class QuartzUtils {private static String JOB_GROUP_NAME = "JOB_GROUP_SYSTEM";private static String TRIGGER_GROUP_NAME = "TRIGGER_GROUP_SYSTEM";/*** @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名* @param sched 调度器* @param jobName 任务名* @param cls 任务* @param params 任务参数* @param time 时间设置,参考quartz说明文档* @Title: QuartzManager.java*/public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, Object params,String time) {try {JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);// 任务名,任务组,任务执行类@SuppressWarnings("unchecked")JobDataMap jobDataMap = new JobDataMap();jobDataMap.put("params", params);JobDetail jobDetail = newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build();TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);// 触发器Trigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();// 触发器时间设定sched.scheduleJob(jobDetail, trigger);if (!sched.isShutdown()) {sched.start();// 启动}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 添加一个定时任务* @param sched 调度器* @param jobName 任务名* @param jobGroupName 任务组名* @param triggerName 触发器名* @param triggerGroupName 触发器组名* @param jobClass 任务* @param params 任务参数* @param time 时间设置,参考quartz说明文档* @Title: QuartzManager.java*/public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,String triggerGroupName, @SuppressWarnings("rawtypes") Class jobClass,  Object params, String time) {try {JobKey jobKey = new JobKey(jobName, jobGroupName);JobDataMap jobDataMap = new JobDataMap();jobDataMap.put("params", params);@SuppressWarnings("unchecked")JobDetail jobDetail = newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build();// 触发器TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);Trigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();sched.scheduleJob(jobDetail, trigger);} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)* @param sched 调度器* @param jobName* @param time* @Title: QuartzManager.java*/@SuppressWarnings("rawtypes")public static void modifyJobTime(Scheduler sched, String jobName, String time) {try {TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(time)) {JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);JobDetail jobDetail = sched.getJobDetail(jobKey);Class objJobClass = jobDetail.getJobClass();Object params = jobDetail.getJobDataMap().get("params");removeJob(sched, jobName);System.out.println("修改任务:" + jobName);addJob(sched, jobName, objJobClass, params,time);}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 修改一个任务的触发时间* @param sched 调度器* @param sched 调度器* @param triggerName* @param triggerGroupName* @param time* @Title: QuartzManager.java*/public static void modifyJobTime(Scheduler sched, String triggerName, String triggerGroupName, String time) {try {TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(time)) {// 修改时间trigger.getTriggerBuilder().withSchedule(cronSchedule(time));// 重启触发器sched.resumeTrigger(triggerKey);}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)* @param sched 调度器* @param jobName* @Title: QuartzManager.java*/public static void removeJob(Scheduler sched, String jobName) {try {TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);sched.pauseTrigger(triggerKey);// 停止触发器sched.unscheduleJob(triggerKey);// 移除触发器JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);boolean b = sched.deleteJob(jobKey);// 删除任务System.out.println(b);} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 移除一个任务* @param sched 调度器* @param jobName* @param jobGroupName* @param triggerName* @param triggerGroupName* @Title: QuartzManager.java*/public static void removeJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,String triggerGroupName) {try {TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);sched.pauseTrigger(triggerKey);// 停止触发器sched.unscheduleJob(triggerKey);// 移除触发器JobKey jobKey = new JobKey(jobName, jobGroupName);sched.deleteJob(jobKey);// 删除任务} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:启动所有定时任务* @param sched  调度器* @Title: QuartzManager.java*/public static void startJobs(Scheduler sched) {try {sched.start();} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:关闭所有定时任务* @param sched 调度器*/public static void shutdownJobs(Scheduler sched) {try {if (!sched.isShutdown()) {sched.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}
}

封装IQuartzSrvice和QuartzServiceImpl

IQuartzService

public interface IQuartzService {//1.添加定时任务void addJob(QuartzJobInfo quartzJobInfo);// 2. 移出定时任务void removeJob(String jobName);}

QuartzServiceImpl

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;@Service
public class QuartzServiceImpl implements IQuartzService {@Autowiredprivate SchedulerFactoryBean schedulerFactory;/** @param scheduler* @param jobName* @param cls* @param params* @param time 时间表达式 定时任务执行的时间   已知 执行的时间  Date--->0/1 * * * * ?*/@Overridepublic void addJob(QuartzJobInfo quartzJobInfo) {/*  Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, Object params,String time  */try {QuartzUtils.addJob(schedulerFactory.getScheduler(),quartzJobInfo.getJobName() , MainJob.class,quartzJobInfo.getParams() , quartzJobInfo.getCronj());} catch (Exception e) {e.printStackTrace();}}@Overridepublic void removeJob(String orderSn) {QuartzUtils.removeJob(schedulerFactory.getScheduler(),orderSn);}
}

封装参数QuartzJobInfo

import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;@Data
public class QuartzJobInfo implements Serializable {private byte type;private String jobName;private Map<String, Object> params;private String cronj;private Date fireDate;public void setFireDate(Date fireDate) {this.fireDate = fireDate;String[] cronArr = new String[7];for (int i = 0; i < cronArr.length; i++) {cronArr[i] = "";}Calendar calendar = Calendar.getInstance();calendar.setTime(fireDate);int second = calendar.get(Calendar.SECOND);int minute = calendar.get(Calendar.MINUTE);int hour = calendar.get(Calendar.HOUR_OF_DAY);int day = calendar.get(Calendar.DAY_OF_MONTH);int month = calendar.get(Calendar.MONTH) + 1;int year = calendar.get(Calendar.YEAR);cronArr[0] = second + "";cronArr[1] = minute + "";cronArr[2] = hour + "";cronArr[3] = day + "";cronArr[4] = month + "";cronArr[5] = "?";cronArr[6] = year + "";String cron = StringUtils.join(cronArr," ").trim();this.setCronj(cron);}
}

编写任务逻辑MainJob

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;@Component
public class MainJob implements Job {@Autowiredprivate IPayBillService payBillService;@Autowiredprivate IAdoptOrderService adoptOrderService;@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {//获取定时器里面的数据JobDataMap jobDataMap = context.getMergedJobDataMap();Map<String,Object> params = (Map<String, Object>) jobDataMap.get("params");//获取定时任务的订单号String orderSn = params.get("orderSn").toString();//执行 修改订单状态的业务逻辑//1.改订单的状态PayBill payBill = payBillService.loadByUnionPaySn(orderSn);payBill.setState(-1);payBill.setUpdateTime(new Date());payBillService.update(payBill);if(PayConstants.BUSINESS_TYPE_ADOPT.equals(payBill.getBusinessType())){//领养订单Long orderId = payBill.getBusinessKey();AdoptOrder order = adoptOrderService.getById(orderId);order.setState(-1);adoptOrderService.update(order);}}
}

调用第三方支付前添加定时任务

AdoptOrderServiceImpl

@Service
public class AdoptOrderServiceImpl extends BaseServiceImpl<AdoptOrder> implements IAdoptOrderService {@Autowiredprivate PetMapper petMapper;@Autowiredprivate UserMapper userMapper;@Autowiredprivate AdoptOrderMapper adoptOrderMapper;@Autowiredprivate UserAddressMapper userAddressMapper;@Autowiredprivate OrderAddressMapper orderAddressMapper;@Autowiredprivate EmployeeMapper employeeMapper;@Autowiredprivate PayBillMapper payBillMapper;@Autowiredprivate IPayBillService payBillService;@Autowiredprivate IQuartzService quartzService;/*** 领养订单结算*/@Override@Transactionalpublic String submit(Map<String, Object> params, Logininfo loginIn) {Long petId = Long.valueOf(params.get("pet_id").toString());Long addressId = Long.valueOf(params.get("address_id").toString());//收货地址:t_user_address的idInteger payMethod = Integer.valueOf(params.get("pay_method").toString());//1支付宝 2微信  3银联 0余额Integer serviceMethod = Integer.valueOf(params.get("service_method").toString());//送货方式//1.修改状态  下架Pet pet = petMapper.loadById(petId);pet.setState(0);pet.setOffsaletime(new Date());//2.绑定用户User user = userMapper.loadByloingInfoId(loginIn.getId());pet.setUser(user);pet.setUser_id(user.getId());pet.setShop_id(pet.getShop().getId());petMapper.update(pet);//3.生成订单  一次性AdoptOrder order = initAdoptOrder(pet, user);//骚操作:为了后边操作支付单,不用再来修改订单,先生成统一的支付单号String unionPaySn = CodeGenerateUtils.generateUnionPaySn();order.setPaySn(unionPaySn);adoptOrderMapper.save(order);// 3.1 生成订单地址UserAddress userAddress = userAddressMapper.loadById(addressId);OrderAddress orderAddress = userAddress2OrderAddress(order, userAddress);orderAddressMapper.save(orderAddress);// 4.支付单PayBill payBill = initPayBill(payMethod, pet, user, order);payBillMapper.save(payBill);// 5.针对支付单添加定时任务QuartzJobInfo info = new QuartzJobInfo();info.setJobName(order.getPaySn());//定时任务的唯一标识Map<String, Object> map = new HashMap<>();map.put("orderSn", payBill.getUnionPaySn());// 定时任务 需要的 数据info.setParams(map);info.setFireDate(payBill.getLastPayTime());//最后的支付时间,定时任务的执行时间quartzService.addJob(info);//调用统一支付接口(老杨定义的)return payBillService.pay(payBill);}private PayBill initPayBill(Integer payMethod, Pet pet, User user, AdoptOrder order) {PayBill payBill = new PayBill();payBill.setDigest(order.getDigest()+"支付单");payBill.setMoney(order.getPrice());//重点:支付唯一表示payBill.setUnionPaySn(order.getPaySn());payBill.setLastPayTime(new Date(System.currentTimeMillis() + 15*60*1000));payBill.setPayChannel(Long.valueOf(payMethod));//0 余额 1 支付宝 2 微信 3 银联payBill.setBusinessType(PayConstants.BUSINESS_TYPE_ADOPT);payBill.setBusinessKey(order.getId());payBill.setUser_id(user.getId());payBill.setShop_id(pet.getShop().getId());payBill.setNickName(user.getUsername());return payBill;}@Overridepublic PageList<AdoptOrder> queryAdmin(AdoptOrderQuery query, Long loginInfoId) {//1.通过loginInfoID查询出EmployeeEmployee employee = employeeMapper.loadByLoginInfoId(loginInfoId);//2.如果employee中的shopID不为null,就是店铺。否则就是平台员工if (employee.getShop_id() != null) {query.setShopId(employee.getShop_id());}return super.queryPage(query);}@Overridepublic PageList<AdoptOrder> queryUser(AdoptOrderQuery query, Long loginInfoId) {User user = userMapper.loadByloingInfoId(loginInfoId);query.setUserId(user.getId());return super.queryPage(query);}private OrderAddress userAddress2OrderAddress(AdoptOrder order, UserAddress userAddress) {OrderAddress orderAddress = new OrderAddress();BeanUtils.copyProperties(userAddress, orderAddress);orderAddress.setId(null);orderAddress.setOrder_id(order.getId());orderAddress.setOrderSn(order.getOrderSn());return orderAddress;}/*** alt  + shift + m** @param petId* @param pet* @param user* @return*/private AdoptOrder initAdoptOrder(Pet pet, User user) {AdoptOrder order = new AdoptOrder();order.setDigest("【摘要】" + pet.getName());order.setPrice(pet.getSaleprice());order.setOrderSn(CodeGenerateUtils.generateOrderSn(user.getId()));order.setLastConfirmTime(new Date(System.currentTimeMillis() + PayConstants.LAST_TIME));//最后确认时间order.setPet_id(pet.getId());order.setUser_id(user.getId());order.setShop_id(pet.getShop().getId());return order;}
}

异步回调后移除定时任务

AlipayController

@RestController
public class AlipayController {@Autowiredprivate IPayBillService payBillService;@Autowiredprivate IAlipayInfoService alipayInfoService;@Autowiredprivate IAdoptOrderService adoptOrderService;@Autowiredprivate IQuartzService quartzService;@PostMapping("/notify")public void notify(HttpServletRequest request){System.out.println("支付宝异步回调!");//获取支付宝POST过来反馈信息try {Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}valueStr = new String(valueStr);params.put(name, valueStr);}String unionPaySn = params.get("out_trade_no");PayBill payBill = payBillService.loadByUnionPaySn(unionPaySn);if(payBill != null){AlipayInfo info = alipayInfoService.getByShopId(payBill.getShop_id());boolean signVerified = AlipaySignature.rsaCheckV1(params,info.getAlipay_public_key(),AlipayConfig.charset,AlipayConfig.sign_type); //调用SDK验证签名if(signVerified) {//验证成功//商户订单号String out_trade_no = unionPaySn;//支付宝交易号String trade_no = request.getParameter("trade_no");//交易状态String trade_status = request.getParameter("trade_status");if(trade_status.equals("TRADE_FINISHED")){//用户确认}else if (trade_status.equals("TRADE_SUCCESS")){//1. 改支付单状态payBill.setState(1);payBill.setUpdateTime(new Date());payBillService.update(payBill);String businessType = payBill.getBusinessType();//2.再修改对应(领养)的订单状态  businessType   businessKey 订单if(PayConstants.BUSINESS_TYPE_ADOPT.equals(businessType)){//领养订单Long orderId = payBill.getBusinessKey();AdoptOrder order = adoptOrderService.getById(orderId);order.setState(1);adoptOrderService.update(order);}//移除针对当前订单的定时任务quartzService.removeJob(out_trade_no);}}else {//验证失败System.out.println("老宋,不要搞事");//调试用,写文本函数记录程序运行情况是否正常//String sWord = AlipaySignature.getSignCheckContentV1(params);//AlipayConfig.logResult(sWord);}}} catch (AlipayApiException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
}

订单支付整体流程

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的JDBC编程

目录 一、概念 二、Java代码操作MySQL 1、创建一个项目 2、引入MySQL的驱动包&#xff0c;作为项目的依赖 3、把 jar包 导入到项目中 4、创建一个数据源 5、建立网络上的连接 6、构造SQL语句 7、执行 sql 语句 8、释放必要的资源.关闭连接 一、概念 JDBC &#xff0c;即…

【Jquery大事件时间线】jquery实现大事件时间线(时间轴)的滚动切换效果『附完整源码』

文章目录 写在前面涉及知识点页面效果1、搭建框架1.1 模块搭建1.2 内容填充1.3 时间线的切换 2、完整代码2.1 html源码2.2 CSS源码2.3 js源码 3、完整源码包下载3.1百度网盘3.2 123云盘3.3邮箱留言 总结 写在前面 其实这种大事件记录的web页面也是我们常见的&#xff0c;尤其是…

Go语言性能优化建议与pprof性能调优详解——结合博客项目实战

文章目录 性能优化建议Benchmark的使用slice优化预分配内存大内存未释放 map优化字符串处理优化结构体优化atomic包小结 pprof性能调优采集性能数据服务型应用go tool pprof命令项目调优分析修改main.go安装go-wrk命令行交互界面图形化火焰图 性能优化建议 简介&#xff1a; …

使用redis-cli操作redis

redis-cli是原生redis自带的命令行工具&#xff0c;可以帮助我们通过简单的命令连接redis服务&#xff0c;并进行数据管理&#xff0c;即redis键&#xff08;key&#xff09;和redis数据结构的管理。 关于如何进入redis-cli命令行客户端&#xff0c;请查看文章&#xff1a;Redi…

CMake:为Eigen库使能向量化

CMake:为Eigen库使能向量化 导言构建Eigen项目结构CMakeLists.txt相关源码 导言 本篇开始将涉及检测外部库相关的内容&#xff0c;期间会穿插着一些其他的内容。为了能够使得系统在系统中运行Eigen库&#xff0c;我们首先需要在系统中配置好Eigen库。然后介绍与Eigen库相关的C…

【Android】APP启动优化学习笔记

启动优化目的 用户体验&#xff1a; 应用的启动速度直接影响用户体验。用户希望应用能够快速启动并迅速响应他们的操作。如果应用启动较慢&#xff0c;用户可能会感到不满&#xff0c;并且有可能选择卸载或切换到竞争对手的应用。通过启动优化&#xff0c;可以提高应用的启动…

132个心理性格趣味测试ACCESS\EXCEL数据库

今天又遇到了一个心理测试的数据库&#xff0c;这个数据库在表结构的设置上很直观&#xff0c;属于那种好的数据库结构&#xff0c;共分三个表&#xff0c;一个是测试项目描述表、一个是测试题选项得分表、一个是根据得分区间解析表&#xff0c;表与表之间通过“question_id”字…

【Python】pyqt6入门到入土系列,非常详细...

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、什么是PyQt6? 简单介绍一下PyQt6 1、基础简介 PyQt6 Digia 公司的 Qt 程序的 Python 中间件。Qt库是最强大的GUI库之一。 PyQt6的官网&#xff1a;www.riverbankcomputing.co.uk/news。 PyQt6是由Riverbank Co…

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…

力扣SQL之路:窗口函数应用

文章目录 1.引言2.力扣SQL题目3. 解题策略4.代码实现5.总结 1.引言 窗口函数是 SQL 中一种强大的分析函数&#xff0c;它可以在结果集中创建一个窗口&#xff0c;并对窗口内的数据进行计算和分析。在力扣&#xff08;LeetCode&#xff09;的 SQL 题目中&#xff0c;窗口函数经…

Linux进程概念(一)

文章目录 Linux进程概念查看进程杀死进程进程标识符 手动创建进程的方式fork函数创建进程 进程状态运行态阻塞态和挂起 Linux进程概念 前文我们了解了&#xff0c;进程的基本概念&#xff0c;在课本上被描述为&#xff0c;正在执行的程序&#xff0c;在linux内核上&#xff0c…

如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1

作者&#xff1a;双飞&#xff08;花名&#xff1a;小鱼&#xff09; 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好&#xff0c;我是 StoneDB 的实习生小鱼&#xff0c;目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久&#xff0c…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快&#xff0c;企业使用前沿技术加快商业创新&#xff0c;以提高竞争力。其中如何加快开发效率&#xff0c;为客户创造更多价值成为新的关注焦点。 继DevOps后&#xff0c;“平台工程”&#xff08;Platform Engineering&#xff09; 一词引发热议。平台工…

MyBatis的使用方法

文章目录 一、MyBatis的创建准备工作 二、MyBatis的使用1.项目分层2.业务代码1&#xff09;使用XML的方法2&#xff09;直接使用注解 总结 一、MyBatis的创建 准备工作 1.添加依赖 旧项目 方法一&#xff1a;在pom.xml中添加MyBatis和MySQL Diver依赖 <!-- 添加 MyBati…

信息技术会考操作题excel,信息技术会考操作题目

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;信息技术会考操作题python计算题&#xff0c;信息技术会考操作题没有保存&#xff0c;今天让我们一起来看看吧&#xff01; 1. 数据分析题&#xff08;17分&#xff09;&#xff1a; 流行病学通常关注单日治愈患者例数增…

网络知识介绍

一、TCP 传输控制协议&#xff0c;Transmission Control Protocol。 面向广域网的通信协议&#xff0c;跨域多个网络通信时&#xff0c;为两个通信端点之间提供一条具有如下特点的通信方式&#xff1a; 基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带…

初识Linux

今天简单了解了关于操作系统的发展史&#xff0c;学习了在Linux中如何远程连接云服务器的指令&#xff0c;以及在Linux中创建多个用户的指令。 1. ssh root 服务器远程地址 作用是用来连接XShell与云服务器&#xff0c;输入该指令后会自动生成输入密码的窗口&#xff0c;如…

【产品经理】高阶产品如何处理需求?(3方法论+2案例+1清单)

不管你是萌新小白&#xff0c;还是工作了几年的“老油条”&#xff0c;需求一直是产品经理工作的重点。只不过&#xff0c;不同年限的产品经理需要面对的需求大有不同&#xff0c;对能力的要求更高。 不知你是否遇过以下问题&#xff1f; 你接手一个项目后&#xff0c;不知从何…

DID以及社交网络中的ZKP

1. 引言 本文关键术语为&#xff1a; Decentralized Identity (DID&#xff0c;去中心化身份) or self-sovereign identity (SSI&#xff0c;自治身份) &#xff1a;是一个基于开放标准的框架&#xff0c;使用自主、独立的标识符和可验证证书&#xff0c;实现可信的数据交换。…

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?

虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶…