微信如何做积分商城网站深圳app开发公司前十名

web/2025/10/4 9:51:35/文章来源:
微信如何做积分商城网站,深圳app开发公司前十名,wordpress is ssl,建设工程的招标网站有哪些不知不觉#xff0c;关于Spring事务的文章已经写了五篇了。老实讲我自己不断质疑过自己#xff1a;现在写这些文章还有意义吗#xff1f;当前的市场已经成什么样了#xff0c;为什么还要固守这落后的技术#xff1f;但是贝索斯一次接受访谈的回答#xff0c;让我写下去的…不知不觉关于Spring事务的文章已经写了五篇了。老实讲我自己不断质疑过自己现在写这些文章还有意义吗当前的市场已经成什么样了为什么还要固守这落后的技术但是贝索斯一次接受访谈的回答让我写下去的决心更加坚定了他是这样说的相较于千变万化的事物我更关注那些恒久不变的东西 书归正传上篇文章我们解决了《Spring事务原理总结四》这篇文章中提到的几个问题中的三个其中“Spring事务异常回滚执行流程”这个问题我们并没有梳理。今天就借这篇文章详细梳理一下。如果各位觉得这些文章对您有用还请多多关注谢谢如果大家觉得有哪些地方梳理的不正确也请大家多多指教非常感谢本篇文章梳理的比较啰嗦大家可以跳过中间过程看最后的总结。如果有些地方大家觉得不对欢迎指出。 执行流程梳理 继续采用《Spring事务原理总结一》中的案例修改TransferServiceImpl类中的check(String, String, BigDecimal)方法具体代码如下所示 Override public void check(String from, String to, BigDecimal money) {System.out.println(校验开始);System.out.println(校验中||...........);try {System.out.println(1 / 0);Thread.sleep(1000 * 5);} catch (InterruptedException e) {}System.out.println(校验中...........);System.out.println(校验结束);}启动程序用debug模式运行SpringTransactionApplication类即可接着会在TransactionAspectSupport类的invokeWithinTransaction(Method method, Nullable Class? targetClass, final InvocationCallback invocation)方法中的断点处停下具体如下图所示 启动程序用debug模式运行SpringTransactionApplication类即可接着会在TransactionAspectSupport类的invokeWithinTransaction(Method method, Nullable Class? targetClass, final InvocationCallback invocation)方法中的断点处停下具体如下图所示 接着让我们继续执行代码直到程序执行到下图所示的断点处停下详情情况请参见下面这幅图 这里需要注意一下控制台并未输出TransferServiceImpl#check(String, String, BigDecimal)方法中要打印的任何内容然后继续执行结果如下图所示 由图中可以看出控制台输出了TransferServiceImpl#check(String, String, BigDecimal)方法要打印的内容并且程序直接进入了catch逻辑。仔细观察会发现这个异常类型为java.lang.ArithmeticException: / by zero这就是我们在代码中添加的System.out.println(1 / 0)抛出的如果这个方法实际操作的是数据库那catch逻辑中要执行的就是回滚操作了。先来看一下这个方法这个方法——completeTransactionAfterThrowing(TransactionInfo, Throwable)——位于TransactionAspectSupport类中的源码如下所示 protected void completeTransactionAfterThrowing(Nullable TransactionInfo txInfo, Throwable ex) {if (txInfo ! null txInfo.getTransactionStatus() ! null) {if (logger.isTraceEnabled()) {logger.trace(Completing transaction for [ txInfo.getJoinpointIdentification() ] after exception: ex);}if (txInfo.transactionAttribute ! null txInfo.transactionAttribute.rollbackOn(ex)) {try {txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());}catch (TransactionSystemException ex2) {logger.error(Application exception overridden by rollback exception, ex);ex2.initApplicationException(ex);throw ex2;}catch (RuntimeException | Error ex2) {logger.error(Application exception overridden by rollback exception, ex);throw ex2;}}else {// We dont roll back on this exception.// Will still roll back if TransactionStatus.isRollbackOnly() is true.try {txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());}catch (TransactionSystemException ex2) {logger.error(Application exception overridden by commit exception, ex);ex2.initApplicationException(ex);throw ex2;}catch (RuntimeException | Error ex2) {logger.error(Application exception overridden by commit exception, ex);throw ex2;}}} }先来看一下下面这幅运行时图片程序运行到if (txInfo.transactionAttribute ! null txInfo.transactionAttribute.rollbackOn(ex))处停下具体见下图 先让我们一起看一下txInfo.transactionAttribute.rollbackOn(ex)这句这段代码的详细执行流程为 执行DelegatingTransactionAttribute#rollbackOn(Throwable ex)注意DelegatingTransaction-Attribute中持有一个TransactionAttribute对象调用RuleBasedTransactionAttribute#rollbackOn(Throwable ex)调用DefaultTransactionAttribute#rollbackOn(Throwable ex) 对于这个调用过程我们需要注意以下几点 DelegatingTransactionAttribute类中持有的TransactionAttribute对象的实际类型是RuleBaseTransactionAttribute这个类的rollbackOn(Throwable)方法实际上是一个代理方法其会把处理转发给RuleBaseTransactionAttribute这个实际类型中的rollbackOn(Throwable)方法。所以DelegatingTransactionAttribute类中的rollbackOn(Throwable)方法的源码非常简单具体如下所示 public boolean rollbackOn(Throwable ex) {return this.targetAttribute.rollbackOn(ex); }RuleBasedTransactionAttribute这个类的rollbackOn(Throwable)方法是实际进行判断的地方其中有一个rollbackRules对象该对象的类型是List其中存储的是一个一个的RollbackRuleAttribute类型的对象首先来看一下rollbackOn(Throwable)这个方法的源码吧 public boolean rollbackOn(Throwable ex) {RollbackRuleAttribute winner null;int deepest Integer.MAX_VALUE;if (this.rollbackRules ! null) {for (RollbackRuleAttribute rule : this.rollbackRules) {int depth rule.getDepth(ex);if (depth 0 depth deepest) {deepest depth;winner rule;}}}// User superclass behavior (rollback on unchecked) if no rule matches.if (winner null) {return super.rollbackOn(ex);}return !(winner instanceof NoRollbackRuleAttribute); }通过这段源码不难发现程序首先会遍历本类持有的rollbackRules对象从中找到适合的数据并赋值给winner接着判断winner对象是否为空如果winner对象为空则直接调用父类的rollbackOn(Throwable)方法判断当前的异常类型是否合法否则判断当前的winner对象是否为NoRollbackRuleAttribute类型并取反然后将结果返回给上级调用者。下面让我们看一下RollbackRuleAttribute类的继承结构具体如下图所示 接下来让我们看一下RuleBasedTransactionAttribute的父类DefaultTransactionAttribute类中的rollbackOn(Throwable)方法的源码 Override public boolean rollbackOn(Throwable ex) {return (ex instanceof RuntimeException || ex instanceof Error); }这个方法的主要作用就是判断当前的异常类型是否为RuntimeException或Error如果是这两个就返回true否则就返回false。 看到这里我不禁有个问题RuleBasedTransactionAttribute对象中的rollbackRules对象中的值是从哪里来的接着让我们改造以下TransferServiceImpl类上的Transactional注解在其中增加一个rollbackFor属性具体如下图所示 然后启动程序查看结果注意断点在RuleBasedTransactionAttribute#rollbackOn()方法中具体如下图所示 从图中不难发现此时rollbackRules对象中的值确实是我们通过rollbackFor属性注入的两个异常类。但我又有点好奇RuleBasedTransactionAttribute#rollbackOn(Throwable)方法中的最后一句“!(winner instanceof NoRollbackRuleAttribute)”中的NoRollbackRuleAttribute这个是从哪里来的还记得Transactional注解上的noRollbackFor属性吗让我们继续改造TransferServiceImpl类上的Transactional注解在其上添加noRollbackFor属性具体如下图所示 然后重新启动程序查看结果注意断点在RuleBasedTransactionAttribute#rollbackOn()方法中具体如下图所示 从图中可以看出我们在注解中指定的CustomException被包装成了NoRollbackRuleAttribute类型的对象由于前面我们更改了TransferServiceImpl类的check()方法其最终会抛出一个名为CustomException类型的异常所以这段代码返回的结果是false最终也就不会执行TransactionAspectSupport中的completeTransactionAfterThrowing(TransactionInfo, Throwable)方法。注意TransferServiceImpl类中的check()方法的源码为 public void check(String from, String to, BigDecimal money) throws Exception {System.out.println(校验开始);System.out.println(校验中||...........);try {// System.out.println(1 / 0);Thread.sleep(1000 * 5);throw new CustomException();} catch (InterruptedException e) {}System.out.println(校验中...........);System.out.println(校验结束); 抛开这些问题继续回到DefaultTransactionAttribute#rollbackFor()方法中最终程序抛出的ArithmeticException异常经过该方法后返回的结果为true。具体如下图所示 总体来看在不指定Transactional注解的rollbackFor属性的时候调用RuleBasedTransact-ionAttribute#rollbackOn()方法的作用就是判断当前异常是否为运行时异常即RuntimeException或者Error如果是则触发后面的回滚逻辑如果不是则不触发后面的回滚逻辑。 接下来让我们继续回到TransactionAspectSupport#completeTransactionAfterThrowing(Tra-nsactionInfo, Throwable)方法中经过前面的判断最终代码走到了txInfo.getTransactionManag-er().rollback(txInfo.getTransactionStatus())这行具体如下图所示 首先来看一下TransactionManager类的rollback(TransactionStatus)方法的源码实际代码位于AbstractPlatformTransactionManager类中 public final void rollback(TransactionStatus status) throws TransactionException {if (status.isCompleted()) {throw new IllegalTransactionStateException(Transaction is already completed - do not call commit or rollback more than once per transaction);}DefaultTransactionStatus defStatus (DefaultTransactionStatus) status;processRollback(defStatus, false); }接着再来看一下processRollback()方法的源码其主要作用就是执行真正的回滚逻辑。下面一起看一下processRollback()方法的源码 private void processRollback(DefaultTransactionStatus status, boolean unexpected) {try {boolean unexpectedRollback unexpected;boolean rollbackListenerInvoked false;try {triggerBeforeCompletion(status);if (status.hasSavepoint()) {if (status.isDebug()) {logger.debug(Rolling back transaction to savepoint);}this.transactionExecutionListeners.forEach(listener - listener.beforeRollback(status));rollbackListenerInvoked true;status.rollbackToHeldSavepoint();}else if (status.isNewTransaction()) {if (status.isDebug()) {logger.debug(Initiating transaction rollback);}this.transactionExecutionListeners.forEach(listener - listener.beforeRollback(status));rollbackListenerInvoked true;doRollback(status);}else {// Participating in larger transactionif (status.hasTransaction()) {if (status.isLocalRollbackOnly() || isGlobalRollbackOnParticipationFailure()) {if (status.isDebug()) {logger.debug(Participating transaction failed - marking existing transaction as rollback-only);}doSetRollbackOnly(status);}else {if (status.isDebug()) {logger.debug(Participating transaction failed - letting transaction originator decide on rollback);}}}else {logger.debug(Should roll back transaction but cannot - no transaction available);}// Unexpected rollback only matters here if were asked to fail earlyif (!isFailEarlyOnGlobalRollbackOnly()) {unexpectedRollback false;}}}catch (RuntimeException | Error ex) {triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN);if (rollbackListenerInvoked) {this.transactionExecutionListeners.forEach(listener - listener.afterRollback(status, ex));}throw ex;}triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK);if (rollbackListenerInvoked) {this.transactionExecutionListeners.forEach(listener - listener.afterRollback(status, null));}// Raise UnexpectedRollbackException if we had a global rollback-only markerif (unexpectedRollback) {throw new UnexpectedRollbackException(Transaction rolled back because it has been marked as rollback-only);}}finally {cleanupAfterCompletion(status);} }通过源码不难发现该方法接收一个TransactionStatus对象作为参数这个对象封装了当前事务的状态信息。当需要回滚事务时例如遇到未捕获异常或者显式调用TransactionTemplate或PlatformTransactionManager的rollback()方法时框架会调用此方法来完成以下任务 清理资源根据事务的具体类型如JDBC、Hibernate、JTA等清理与事务相关的一些资源这可能包括数据库连接的回滚操作或者其他事务性资源的相应清理工作更新事务状态将事务状态标记为已回滚确保后续不会尝试提交这个事务触发监听器或回调如果有注册的事务同步监听器TransactionSynchronizationAdapter则会触发相应的 afterCompletion 回调方法通知它们事务已经回滚 总之processRollback方法实现了事务生命周期中的“回滚”阶段确保事务能够按照预期进行回滚从而维持事务的原子性和一致性。通过debug跟踪和阅读源码我们发现本示例最终走到了elsle if分支该逻辑片段最终会调用DatasourceTransactionManager类的doRollback(DefaultTransactionStatus)方法先来看一下这个方法的源码吧具体如下所示 protected void doRollback(DefaultTransactionStatus status) {DataSourceTransactionObject txObject (DataSourceTransactionObject) status.getTransaction();Connection con txObject.getConnectionHolder().getConnection();if (status.isDebug()) {logger.debug(Rolling back JDBC transaction on Connection [ con ]);}try {con.rollback();}catch (SQLException ex) {throw translateException(JDBC rollback, ex);} }通过源码我们可以很清晰的看到其最终就是通过调用Connection对象上的rollback()方法来完成事务的回滚的。 总结 文章进行到这里前面遗留的问题基本上就梳理完了。首先通过这篇文章我们可以很清晰的看到Spring的设计者利用动态代理cglib动态代理及各种设计模式责任链、模板等设计模式其中模板设计模式在AbstractPlatformTransactionManager类体现的最为明显。该类中的rollback(TransactionStatus)方法规定了调用流程即调用本类的processRollback(DefaultTransactionStatus, boolean)方法而该方法又继续调用了本类中的模板方法doRollback(DefaultTransactionStatus)实际上调用的是其实现类中的方法完成了事务逻辑的抽离使开发者可以花费更多的精力在业务代码的编写上。下面就让我们一起看一下AbstractPlatformTransactionManager类中的这几个方法的源码 public final void rollback(TransactionStatus status) throws TransactionException {if (status.isCompleted()) {throw new IllegalTransactionStateException(Transaction is already completed - do not call commit or rollback more than once per transaction);}DefaultTransactionStatus defStatus (DefaultTransactionStatus) status;processRollback(defStatus, false); } // private void processRollback(DefaultTransactionStatus status, boolean unexpected) {try {boolean unexpectedRollback unexpected;boolean rollbackListenerInvoked false;try {triggerBeforeCompletion(status);if (status.hasSavepoint()) {if (status.isDebug()) {logger.debug(Rolling back transaction to savepoint);}this.transactionExecutionListeners.forEach(listener - listener.beforeRollback(status));rollbackListenerInvoked true;status.rollbackToHeldSavepoint();}else if (status.isNewTransaction()) {if (status.isDebug()) {logger.debug(Initiating transaction rollback);}this.transactionExecutionListeners.forEach(listener - listener.beforeRollback(status));rollbackListenerInvoked true;doRollback(status);}else {// Participating in larger transactionif (status.hasTransaction()) {if (status.isLocalRollbackOnly() || isGlobalRollbackOnParticipationFailure()) {if (status.isDebug()) {logger.debug(Participating transaction failed - marking existing transaction as rollback-only);}doSetRollbackOnly(status);}else {if (status.isDebug()) {logger.debug(Participating transaction failed - letting transaction originator decide on rollback);}}}else {logger.debug(Should roll back transaction but cannot - no transaction available);}// Unexpected rollback only matters here if were asked to fail earlyif (!isFailEarlyOnGlobalRollbackOnly()) {unexpectedRollback false;}}}catch (RuntimeException | Error ex) {triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN);if (rollbackListenerInvoked) {this.transactionExecutionListeners.forEach(listener - listener.afterRollback(status, ex));}throw ex;}triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK);if (rollbackListenerInvoked) {this.transactionExecutionListeners.forEach(listener - listener.afterRollback(status, null));}// Raise UnexpectedRollbackException if we had a global rollback-only markerif (unexpectedRollback) {throw new UnexpectedRollbackException(Transaction rolled back because it has been marked as rollback-only);}}finally {cleanupAfterCompletion(status);} } // protected abstract void doRollback(DefaultTransactionStatus status) throws TransactionException;下面再回顾一下AbstractPlatformTransactionManager的实现类DataSourceTransactionManager中的doRollback()方法的源码如果向了解这两个类的继承关系可以浏览《Spring 事务原理总结三》这篇文章 protected void doRollback(DefaultTransactionStatus status) {DataSourceTransactionObject txObject (DataSourceTransactionObject) status.getTransaction();Connection con txObject.getConnectionHolder().getConnection();if (status.isDebug()) {logger.debug(Rolling back JDBC transaction on Connection [ con ]);}try {con.rollback();}catch (SQLException ex) {throw translateException(JDBC rollback, ex);} }接着通过本章强化了我们对Transactional注解的认识该注解上的rollbackFor属性可以指定哪些异常发生时需要执行回滚操作该注解上的noRollbackFor属性则可以指定哪些异常发生时不需要执行回滚操作Spring设计者的这个设计为开发者在开发中按照业务异常分别处理异常提供了很大的便利。另外通过本章我们也知道了通过这两个属性指定的异常最终会被分别包装成RollbackRuleAttribute和No RollbackRuleAttribute类型的对象程序执行时会通过RuleBasedTransactionAttribute中的rollbackOn(Throwable ex)方法进行区分并加以判断具体判断代码如下所示含DelegatingTransactionAttribute和RuleBasedTransactionAttribute的父类DefaultTransactionAttribute中的rollbackOn(Throwable)方法 / DelegatingTransactionAttribute类中的rollbackOn(Throwable)方法 public boolean rollbackOn(Throwable ex) {return this.targetAttribute.rollbackOn(ex); } // RuleBasedTransactionAttribute类中的rollbackOn(Throwable)方法 public boolean rollbackOn(Throwable ex) {RollbackRuleAttribute winner null;int deepest Integer.MAX_VALUE;if (this.rollbackRules ! null) {for (RollbackRuleAttribute rule : this.rollbackRules) {int depth rule.getDepth(ex);if (depth 0 depth deepest) {deepest depth;winner rule;}}}// User superclass behavior (rollback on unchecked) if no rule matches.if (winner null) {return super.rollbackOn(ex);}return !(winner instanceof NoRollbackRuleAttribute); } // RuleBasedTransactionAttribute的父类DefaultTransactionAttribute中的rollbackOn(Throwable)方法 Override public boolean rollbackOn(Throwable ex) {return (ex instanceof RuntimeException || ex instanceof Error); }

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

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

相关文章

如何优化企业网站哪个网站做加盟

电话光端机就是把传统的电话信号转换成光信号,可通过光纤传输电话、以太网、音频的设备,让电话信号能够传输的更长距离,而且传输速率上也有很大的提高。电话光端机和PDH光端机用法各不一样,而PDH光端机简单的说是通过光纤来传输E1信号和100M以太网信号。…

手机客户端网站怎么做eclipse 开发jsp网站开发

跟着B站的视频敲了一个略微复杂的WPF界面,链接如下.在这里我详细的写一份博客进行设计总结. 系统介绍和配置及主窗口设计_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Wy421Y7QD?p1&vd_source4796b18a2e4c1ec8a310391a5644b6da 成果展示 实现过程 总体来说,我的…

网站建设费用计入管理费用的哪个科目宁波制作网站企业

2019独角兽企业重金招聘Python工程师标准>>> 1、导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 存放位置比如: mysqldump -u root -p project > c:/a.sql 2.导出一个表的结构,并且带表中的数据 mysqldump -u 用户名 -p 数据库名 …

asp网站发布ftp长春市做网站哪家好

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

php网站模板怎么用网页制作论坛

一、问题描述 该问题的具体表现就如上图一样,模块——”spring-ioc-xml-01“的应该有一个蓝色的方块。现在蓝色方块缺失了之后,我们需要让maven工程重新识别出这个模块。 二、问题分析 出现这种问题的原因:是当前的maven工程没有能够成功的识…

汕头网站建设方法港北网站建设

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 多线程向来是面试的重灾…

简述电子商务的概念优化设计方案

技术背景 一般情况下我们会选择使用明文形式来存储数据,如json、txt、csv等等。如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式。还有一种比较紧凑的数据存储格式,就是直接按照二进制格式存储。这种格式下,存储…

网站关键词如何快速上首页wordpress远程下载

目录 vue2的设置方法 vue3的设置方法 1.vue3兼容vue2的写法 2.vue3没有使用setup语法糖 3.vue3的setup会自动生成name 4.使用插件 设置name的用处&#xff1a;页面缓存需要识别页面的唯一name属性才可以缓存 vue2的设置方法 <script>export default {name: "…

网站开发问题网店运营推广网站

1.首先需要使用 composer 在命令行安装最新版本的 intervention/image &#xff1a; composer require intervention/image2.注册服务提供者及别名&#xff08;Laravel 版本 ≤ 5.4&#xff09; 如果你的 laravel 版本小于或等于 5.4&#xff0c;安装后需要注册服务提供者和别…

河北网络推广公司哈尔滨网络建设网络优化

除了前一节讨论的拉电阻基本使用方法外&#xff0c;上拉电阻也可以提升高电平的电压阈值&#xff0c;以便于前后级信号相匹配&#xff0c;比如&#xff0c;TTL逻辑电平驱动CMOS逻辑电平时&#xff0c;我们通常会添加一个上拉电阻R1&#xff0c;如下图所示&#xff1a;But Why&a…

旅游网站结构图建设一个货架网站

https://mastergo.com/files/home 这个网站是一个设计图片的网站 ui设计方面的网站 有很多优秀的资源 比如App设计 可以直接用的图片 和设计模板 也可以像ps 一样 设计自己的图片或者ui图 适合前端和ui开发者使用 可以丰富自己的审美观

怎么做装修网站平台代理公司注册要提供什么资料

在此博客中&#xff0c;我将解释如何为您的Mule CloudHub应用程序启用AWS Cloudwatch日志 。 AWS提供了Cloudwatch Logs Services&#xff0c;以便您可以更好地管理日志。 它比松散便宜。 由于cloudhub会自动翻转超过100 MB的日志&#xff0c;因此我们需要一种机制来更有效地管…

多语言网站 推广网站建设语音

配置路由式Proxy ARP示例 组网图形 图1 配置路由式Proxy ARP组网图 路由式Proxy ARP简介配置注意事项组网需求配置思路操作步骤配置文件 路由式Proxy ARP简介 企业内部进行子网划分时&#xff0c;可能会出现两个子网网络属于同一网段&#xff0c;但是却不属于同一物理网络的情…

网站建设管理属于职业资格吗wordpress模板dux

大家好&#xff01;作为专业吃鸡行家&#xff0c;我将为您带来一些热门话题和实用内容&#xff0c;帮助您提升游戏战斗力&#xff0c;分享顶级游戏作战干货&#xff0c;并提供便捷的作图工具和查询服务。让我们一起享受吃鸡的乐趣&#xff01; 首先&#xff0c;我要推荐一款绝地…

快钱支付需要网站备案吗小程序制作方案

羊大师分析&#xff0c;夏季羊奶的适合人群有哪些&#xff1f; 夏季羊奶的适合人群相当广泛&#xff0c;主要包括以下几类人群&#xff1a; 生长发育中的孩子&#xff1a;羊奶富含营养&#xff0c;特别是蛋白质和矿物质&#xff0c;对孩子的生长发育有积极的促进作用。 中老年…

扁平化 公司网站南通公司快速建站

今天测试部门的人叫我过去&#xff0c;说是数据库当了&#xff0c;起不来了。我过去看了看情况&#xff0c;做了如下操作SQL> shutdown immediate数据库已经关闭。已经卸载数据库。Oracle 例程已经关闭。SQL> startupORACLE 例程已经启动。Total System Global Area 135…

榆次住房保障和城乡建设局网站免费简单网站

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性&#xff1a;封装、继承、多态&#xff0c;真正领悟设计模式的精髓是可能一个漫长的过程&#xff0c;需要大量实践经验的积累。最近看设计模式的书&#xff0…

全屋定制十大品牌排行榜济南网站seo报价

介绍Gogs项目旨在构建一种简单&#xff0c;稳定和可扩展的自托管Git服务&#xff0c;该服务可以通过最轻松的方式进行设置。使用Go语言开发的git自托管服务&#xff0c;部署十分简单&#xff0c;可以在Go支持的所有平台(包括Linux&#xff0c;macOS&#xff0c;Windows和ARM)上…

自微网站如何做好品牌宣传

在数字化时代的到来之后&#xff0c;虚拟货币逐渐成为了一种广为人知的金融工具。虚拟货币是一种数字化的资产&#xff0c;它不像传统货币那样由政府或中央银行发行和监管。相反&#xff0c;虚拟货币通过密码学技术和分布式账本技术来实现去中心化的发行和交易。 虚拟货币的代…