下面一起来了解下如何实现SpringBoot+Quartz+Maven+MySql动态定时任务,相信大家看完肯定会受益匪浅,文字在精不在多,希望如何实现SpringBoot+Quartz+Maven+MySql动态定时任务这篇短内容是你想要的。 1.Quartz需要导入的包,Maven配置 org.quartz-scheduler quartz 2.2.3 org.quartz-scheduler quartz-jobs 2.2.3 2.Quartz需要用到的表 DROP TABLE IF EXISTS qrtz_fired_triggers; DROP TABLE IF EXISTS qrtz_paused_trigger_grps; DROP TABLE IF EXISTS qrtz_scheduler_state; DROP TABLE IF EXISTS qrtz_locks; DROP TABLE IF EXISTS qrtz_simple_triggers; DROP TABLE IF EXISTS qrtz_simprop_triggers; DROP TABLE IF EXISTS qrtz_cron_triggers; DROP TABLE IF EXISTS qrtz_blob_triggers; DROP TABLE IF EXISTS qrtz_triggers; DROP TABLE IF EXISTS qrtz_job_details; DROP TABLE IF EXISTS qrtz_calendars; #– 存储每一个已配置的 Job 的详细信息 CREATE TABLE qrtz_job_details( SCHED_NAME VARCHAR(120) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, JOB_CLASS_NAME VARCHAR(250) NOT NULL, IS_DURABLE VARCHAR(1) NOT NULL, IS_NONCONCURRENT VARCHAR(1) NOT NULL, IS_UPDATE_DATA VARCHAR(1) NOT NULL, REQUESTS_RECOVERY VARCHAR(1) NOT NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #–存储已配置的 Trigger 的信息 CREATE TABLE qrtz_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, NEXT_FIRE_TIME BIGINT(13) NULL, PREV_FIRE_TIME BIGINT(13) NULL, PRIORITY INTEGER NULL, TRIGGER_STATE VARCHAR(16) NOT NULL, TRIGGER_TYPE VARCHAR(8) NOT NULL, START_TIME BIGINT(13) NOT NULL, END_TIME BIGINT(13) NULL, CALENDAR_NAME VARCHAR(200) NULL, MISFIRE_INSTR SMALLINT(2) NULL, JOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) REFERENCES qrtz_job_details(SCHED_NAME,JOB_NAME,JOB_GROUP) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 存储简单的 Trigger,包括重复次数,间隔,以及已触的次数 CREATE TABLE qrtz_simple_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, REPEAT_COUNT BIGINT(7) NOT NULL, REPEAT_INTERVAL BIGINT(12) NOT NULL, TIMES_TRIGGERED BIGINT(10) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 存储 Cron Trigger,包括 Cron 表达式和时区信息 CREATE TABLE qrtz_cron_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, CRON_EXPRESSION VARCHAR(120) NOT NULL, TIME_ZONE_ID VARCHAR(80), PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 存储简单的 Trigger,包括重复次数,间隔,以及已触的次数 CREATE TABLE qrtz_simprop_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, STR_PROP_1 VARCHAR(512) NULL, STR_PROP_2 VARCHAR(512) NULL, STR_PROP_3 VARCHAR(512) NULL, INT_PROP_1 INT NULL, INT_PROP_2 INT NULL, LONG_PROP_1 BIGINT NULL, LONG_PROP_2 BIGINT NULL, DEC_PROP_1 NUMERIC(13,4) NULL, DEC_PROP_2 NUMERIC(13,4) NULL, BOOL_PROP_1 VARCHAR(1) NULL, BOOL_PROP_2 VARCHAR(1) NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– Trigger 作为 Blob 类型存储 #– (用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore并不知道如何存储实例的时候) CREATE TABLE qrtz_blob_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, BLOB_DATA BLOB NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 以 Blob 类型存储 Quartz 的 Calendar 信息 CREATE TABLE qrtz_calendars ( SCHED_NAME VARCHAR(120) NOT NULL, CALENDAR_NAME VARCHAR(200) NOT NULL, CALENDAR BLOB NOT NULL, PRIMARY KEY (SCHED_NAME,CALENDAR_NAME) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 存储已暂停的 Trigger 组的信息 CREATE TABLE qrtz_paused_trigger_grps ( SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息 CREATE TABLE qrtz_fired_triggers ( SCHED_NAME VARCHAR(120) NOT NULL, ENTRY_ID VARCHAR(95) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, FIRED_TIME BIGINT(13) NOT NULL, SCHED_TIME BIGINT(13) NOT NULL, PRIORITY INTEGER NOT NULL, STATE VARCHAR(16) NOT NULL, JOB_NAME VARCHAR(200) NULL, JOB_GROUP VARCHAR(200) NULL, IS_NONCONCURRENT VARCHAR(1) NULL, REQUESTS_RECOVERY VARCHAR(1) NULL, PRIMARY KEY (SCHED_NAME,ENTRY_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 存储少量的有关 Scheduler 的状态信息,和别的 Scheduler 实例(假如是用于一个集群中) CREATE TABLE qrtz_scheduler_state ( SCHED_NAME VARCHAR(120) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, LAST_CHECKIN_TIME BIGINT(13) NOT NULL, CHECKIN_INTERVAL BIGINT(13) NOT NULL, PRIMARY KEY (SCHED_NAME,INSTANCE_NAME) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; #– 存储程序的悲观锁的信息(假如使用了悲观锁) CREATE TABLE qrtz_locks ( SCHED_NAME VARCHAR(120) NOT NULL, LOCK_NAME VARCHAR(40) NOT NULL, PRIMARY KEY (SCHED_NAME,LOCK_NAME) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON
qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY); CREATE INDEX IDX_QRTZ_J_GRP ON qrtz_job_details(SCHED_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_T_J ON
qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_T_JG ON qrtz_triggers(SCHED_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_T_C ON qrtz_triggers(SCHED_NAME,CALENDAR_NAME); CREATE INDEX IDX_QRTZ_T_G ON qrtz_triggers(SCHED_NAME,TRIGGER_GROUP); CREATE INDEX IDX_QRTZ_T_STATE ON
qrtz_triggers(SCHED_NAME,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_N_STATE ON
qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_N_G_STATE ON
qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON
qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME); CREATE INDEX IDX_QRTZ_T_NFT_ST ON
qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME); CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON
qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME); CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON
qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON
qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE); CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON
qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME); CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON
qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY); CREATE INDEX IDX_QRTZ_FT_J_G ON
qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_FT_JG ON
qrtz_fired_triggers(SCHED_NAME,JOB_GROUP); CREATE INDEX IDX_QRTZ_FT_T_G ON
qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP); CREATE INDEX IDX_QRTZ_FT_TG ON
qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP); commit; 3.Quartz需要用到的配置(quartz.properties) #quartz集群配置 #
=========================================================================== # Configure Main Scheduler Properties 调度器属性 #
=========================================================================== #调度标识名 集群中每一个实例都必须使用相同的名称 org.quartz.scheduler.instanceName=DefaultQuartzScheduler #ID设置为自动获取 每一个必须不同 org.quartz.scheduler.instanceid=AUTO #============================================================================ # Configure ThreadPool #============================================================================ #线程池的实现类(一般使用SimpleThreadPool即可满足几乎所有用户的需求) org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool #指定线程数,至少为1(无默认值)(一般设置为1-100直接的整数合适) org.quartz.threadPool.threadCount = 25 #设置线程的优先级(最大为java.lang.Thread.MAX_PRIORITY 10,最小为Thread.MIN_PRIORITY
1,默认为5) org.quartz.threadPool.threadPriority = 5 #============================================================================ # Configure JobStore #============================================================================ # 信息保存时间 默认值60秒 org.quartz.jobStore.misfireThreshold = 60000 #数据保存方式为数据库持久化 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX #数据库代理类,一般org.quartz.impl.jdbcjobstore.StdJDBCDelegate可以满足大部分数据库 org.quartz.jobStore.driverDelegateClass =
org.quartz.impl.jdbcjobstore.StdJDBCDelegate #JobDataMaps是否都为String类型 org.quartz.jobStore.useProperties = false #数据库别名 随便取 org.quartz.jobStore.dataSource = myDS #表的前缀,默认QRTZ_ org.quartz.jobStore.tablePrefix = QRTZ_ #是否加入集群 org.quartz.jobStore.isClustered = true #调度实例失效的检查时间间隔 org.quartz.jobStore.clusterCheckinInterval = 20000 #============================================================================ # Configure Datasources #============================================================================ #数据库引擎 org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver #数据库连接 org.quartz.dataSource.myDS.URL =
jdbc:mysql://localhost:3306/testdb?characterEncoding=utf8&allowMultiQueries=true&useSSL=false&autoReconnect=true #数据库用户 org.quartz.dataSource.myDS.user = root #数据库密码 org.quartz.dataSource.myDS.password = root #允许最大连接 org.quartz.dataSource.myDS.maxConnections = 5 #验证查询sql,可以不设置 org.quartz.dataSource.myDS.validationQuery=select 0 from dual 4.Quartz任务工厂类(TaskJobFactory) @Component public class TaskJobFactory extends AdaptableJobFactory { @Autowired AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws
Exception { //调用父类的方法 Object jobInstance = super.createJobInstance(bundle); //进行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } } 5.Quartz配置类(QuartzConfigurer) @Configuration public class QuartzConfigurer { @Autowired DataSource dataSource; @Autowired TaskJobFactory jobFactory; @Bean(name = “SchedulerFactory”) public SchedulerFactoryBean schedulerFactoryBean() throws IOException { //获取配置属性 PropertiesFactoryBean propertiesFactoryBean = new
PropertiesFactoryBean(); propertiesFactoryBean.setLocation(new
ClassPathResource(“/quartz.properties”)); //在quartz.properties中的属性被读取并注入后再初始化对象 propertiesFactoryBean.afterPropertiesSet(); //创建SchedulerFactoryBean SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setQuartzProperties(propertiesFactoryBean.getObject()); factory.setJobFactory(jobFactory); return factory; } /* * 通过SchedulerFactoryBean获取Scheduler的实例 */ @Bean(name = “scheduler”) public Scheduler scheduler() throws IOException { return schedulerFactoryBean().getScheduler(); } } 6.Quartz操作类(QuartzJobManager) @Component public class QuartzJobManager { private static final Logger logger =
LoggerFactory.getLogger(QuartzJobManager.class); private static QuartzJobManager jobUtil; @Autowired private Scheduler scheduler; public QuartzJobManager() { logger.info(“init jobUtil”); jobUtil = this; } public static QuartzJobManager getInstance() { logger.info(“return JobCreateUtil”); return QuartzJobManager.jobUtil; } /** * 创建job * * @param clazz 任务类 * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 * @param cronExpression cron表达式 */ public void addJob(Class clazz, String jobName, String jobGroupName, String
cronExpression) { addJob(clazz, jobName, jobGroupName, cronExpression, null); } /** * 创建job,可传参 * * @param clazz 任务类 * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 * @param cronExpression cron表达式 * @param argMap map形式参数 */ public void addJob(Class clazz, String jobName, String jobGroupName, String
cronExpression, Map argMap) { try { // 启动调度器 scheduler.start(); //构建job信息 JobDetail jobDetail = JobBuilder.newJob(((Job)
clazz.newInstance()).getClass()).withIdentity(jobName,
jobGroupName).build(); //表达式调度构建器(即任务执行的时间) CronScheduleBuilder scheduleBuilder =
CronScheduleBuilder.cronSchedule(cronExpression); //按新的cronExpression表达式构建一个新的trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName,
jobGroupName).withSchedule(scheduleBuilder).build(); //获得JobDataMap,写入数据 if (argMap != null) { trigger.getJobDataMap().putAll(argMap); } scheduler.scheduleJob(jobDetail, trigger); } catch (Exception e) { e.printStackTrace(); } } /** * 暂停job * * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 */ public void pauseJob(String jobName, String jobGroupName) { try { scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName)); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 恢复job * * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 */ public void resumeJob(String jobName, String jobGroupName) { try { scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName)); } catch (SchedulerException e) { e.printStackTrace(); } } /** * job 更新,只更新频率 * * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 * @param cronExpression cron表达式 */ public void updateJob(String jobName, String jobGroupName, String
cronExpression) { updateJob(jobName, jobGroupName, cronExpression, null); } /** * job 更新,更新频率和参数 * * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 * @param cronExpression cron表达式 * @param argMap 参数 */ public void updateJob(String jobName, String jobGroupName, String
cronExpression, Map argMap) { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName); // 表达式调度构建器 CronScheduleBuilder scheduleBuilder =
CronScheduleBuilder.cronSchedule(cronExpression); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 按新的cronExpression表达式重新构建trigger trigger =
trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); //修改map if (argMap != null) { trigger.getJobDataMap().putAll(argMap); }无锡医院 http://www.bhnkyixue.com/ // 按新的trigger重新设置job执行 scheduler.rescheduleJob(triggerKey, trigger); } catch (Exception e) { e.printStackTrace(); } } /** * job 更新,只更新更新参数 * * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 * @param argMap 参数 */ public void updateJob(String jobName, String jobGroupName, Map argMap)
{ try { TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); //修改map trigger.getJobDataMap().putAll(argMap); // 按新的trigger重新设置job执行 scheduler.rescheduleJob(triggerKey, trigger); } catch (Exception e) { e.printStackTrace(); } } /** * job 删除 * * @param jobName 任务名称 * @param jobGroupName 任务所在组名称 */ public void deleteJob(String jobName, String jobGroupName) { try { scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName)); scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName)); scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName)); } catch (Exception e) { e.printStackTrace(); } } /** * 启动所有定时任务 */ public void startAllJobs() { try { scheduler.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 关闭所有定时任务 */ public void shutdownAllJobs() { try { if (!scheduler.isShutdown()) { scheduler.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * 获取所有任务列表 * * @return */ public List> getAllJob() { GroupMatcher matcher = GroupMatcher.anyJobGroup(); List> jobList = new ArrayList(); Set jobKeys = null; try { jobKeys = scheduler.getJobKeys(matcher); for (JobKey jobKey : jobKeys) { List triggers = scheduler.getTriggersOfJob(jobKey); for (Trigger trigger : triggers) { Map job = new HashMap(); job.put(“jobName”, jobKey.getName()); job.put(“jobGroupName”, jobKey.getGroup()); job.put(“trigger”, trigger.getKey()); Trigger.TriggerState triggerState =
scheduler.getTriggerState(trigger.getKey()); job.put(“jobStatus”, triggerState.name()); if (trigger instanceof CronTrigger) { CronTrigger cronTrigger = (CronTrigger) trigger; String cronExpression = cronTrigger.getCronExpression(); job.put(“cronExpression”, cronExpression); } jobList.add(job); } } } catch (SchedulerException e) { e.printStackTrace(); } return jobList; } } 7.测试类(TestQuartz) @Component public class TestQuartz implement开发云主机域名s Job { @Override public void execute(JobExecutionContext context) throws
JobExecutionException { //获取任务名 String taskName = context.getJobDetail().getKey().getName(); //处理执行任务之后的业务 } } 8.测试类(JobController) @Controller @RequestMapping(“/job”) public class JobController { @Autowired QuartzJobManager quartzJobManager; @GetMapping(“/add”) public void add(HttpServletRequest request) { //任务名称 String name = request.getParameter(“name”); //任务组名称 String groupName = “task”; //cron表达式 String cron = “0 0/1 * * * ?”; //需要给任务携带的参数 Map map = new HashMap(); map.put(“name”, “张三”); map.put(“sex”, “0”); quartzJobManager.addJob(TestQuartz.class, name, groupName, cron, map); } @GetMapping(“/del”) public void del(HttpServletRequest request) { String name = request.getParameter(“name”); String groupName = “task”; quartzJobManager.deleteJob(name, groupName); } } 这是一个Quartz动态任务需要的所有源码,测试里面只写了2个,其他的可以自己去测试,一个简单的Quartz的测试案例就搭建好了,你也可以直接在这个基础上结合项目的业务场景去扩展。看完如何实现SpringBoot+Quartz+Maven+MySql动态定时任务这篇文章后,很多读者朋友肯定会想要了解更多的相关内容,如需获取更多的行业信息,可以关注我们的行业资讯栏目。
本文主要给大家简单讲讲Mysql与Oracle主要有哪些区别,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望Mysql与Oracle主要有哪些区别这篇文章可以给大家带来一些实际帮助。 MySQL默认提交事务,同时…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。