zoukankan      html  css  js  c++  java
  • 面试题1

    ---恢复内容开始---

    1.++i 先计算后输出
    2.arraycopy(a,2,b,2,2) 从a数组第二位复制两位替换掉b数组第二位后两位
    3.java独特特点,平台无关性。
    4..java文件编译成.class文件
    5.读取图片文件可使用
    6.linkedhashset会保留顺序,treeset会自动排序。
    7.java变量名不能是数字,不能是关键字。
    8.private表示私有,只能在本类中使用。
    9.对象需要跨网络传输,需要实现Serializable接口
    10.生命抽象方法不可写大括号。
    11.count+=i 表示count=i+count
    12.spring boot框架,其实他不算是一个框架,他算是整合了多个框架。他拥有自己的pom.xml和配置文件,通过配置文件或YML实现了对SSM或者其他框架的整合,通过一个application的main方法和注解启动spring boot。他的使用场景非常广泛,因为他整合多个框架,所以广泛应用在各种项目开发和分布式项目的搭建。一般是使用IDEA创建spring boot项目,然后勾选需要的maven依赖。遇到的坑:在创建完成后,无法启动spring boot项目。
    13.select sum(列名) from 表名 where //求综合
    select avg(列名) from 表名 where //求平均数
    select count(1) from 表名 where //次数
    select 列名 from 表名 where 列名> < //对比
    优化数据库方法:
    1.避免在子句中使用!=或<>判断,所以拆分语句
    2.添加索引。
    3.避免全表查询

    14.java中线程实现方式:
    1.classA继承thread,并重写run方法,new A.start(),启动线程
    2.classA实现Runnable接口,并覆盖run方法,new thread(new A()).start()0,启动线程。
    15.i=12;
    i+=i-=i*=i (结果为-120)
    16.反射就是运行中的程序检查自己和软件运行环境的能力,它可以根据他发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。
    invoke()方法就是调用method类代表的方法,可以实现动态调用。
    17.linux系统中,Rm-r /mnt/tmp所代表的是删除文件夹中所有文件
    18.elasticSearch和solr类似,创建索引,全文检索的一个开源框架
    19.在java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
    20.对数据进行枷锁,程序先通过acquire获取锁来对数据排他访问,然后对数据进行一系列的操作最后释放锁。
    21.解决集群环境下session共享问题,有下面四种方案:(1).粘性session,每次都将同一用户的所有请求转发至同一台服务器上,用户与服务器绑定。(2).服务器session,每次session发生变化时,就广播给所有集群中的服务器,使所有服务器上的session相同.(3).session共享,缓存session,使用redis,memcached。(4).session持久化,将session存储到数据库中,向操作数据一样操作session。

    22.被final修饰的类无法被继承,被final修饰的方法无法被重写。被final修饰的值为常量。
    final关键字提高了性能,保证安全。使用final关键字,jvm会对方法变量及类进行优化。
    23.stringbuffer和stringbuilder的区别:他们两个方法功能完全等价,buffer中方法采用了synchronized关键字进行修饰,因此线程安全。同理builder线程非安全。 单线程程序下,builder效率更快,因为不需要加锁
    24. contructors 构造函数 applied 应用
    25. 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public,private,protected修饰。
    26.error是系统中的错误,程序员不能改变和处理,实在程序编译救赎先错误,仅靠程序本身无法恢复和预防,遇到这样的问题,建议终止程序。
    而exception是可以处理的异常,可以捕获可能恢复。遇到这类问题尽可能处理异常,是程序恢复
    27.GET请求=数据库select
    PUT请求=数据库update
    POST请求=数据库insert
    delete请求=数据库delete
    28.抽象类和接口的区别,一个是继承,一个是实现。抽象方法有public修饰,接口默认是public不可以修饰。抽象类可定义构造方法,也可以有抽象方法和具体方法。接口完全抽象无构造方法。extends继承抽象类,implements实现接口。
    29.方法的重写和重载是java多态性的不同表现。
    override(重写)特点:(1).子类方法名称,参数类型必须要和父类完全匹配,才能重写。(2).子类的方法返回值必须和父类相同,可以扩大不可缩小。(3).子类方法抛出异常,只能是父类抛出异常的子异常。(4).被private、final等关键字修饰不能被重写。(5)不是抽象方法不能被abstract修饰。
    overload(重载)特点:(1).再使用重载时只能通过不同的参数样式。(2).方法异常类型和数目不会对重载造成影响.(3).不能通过访问权限、返回类型、抛出异常进行重载。

    30.dependency injection=依赖注入
    实现依赖注入的不同方法:构造函数注入,设值注入。
    31.annotation=注解
    @Aspect 指定一个类为切面类
    @Before 前置通知:目标方法之前执行
    @AfterReturning 返回后通知:执行方法结束前执行
    @Around 环绕通知:环绕目标方法执行
    @AfterThrowing 异常通知:出现异常执行
    @After 后置通知:目标方法之后执行
    配置文件中添加<aop:aspectj-autoproxy/>元素,启用对于@AspectJ注解的支持
    @Conmponent 加入IOC容器

    32.当使用|时,若前面的表达式为真时,程序会继续执行后面的表达式,然后再得到true结果。
    ||时,若前面的表达式结果为真,则程序不会再执行后面的表达式,直接得出TRUE的结果。

    33.switch可作用于char,byte,short,int和他们对应的包装类。可作用于string类型,枚举类型。不可作用于long,double,float,boolean类型和他们的包装类。
    34. hashmap线程非安全,允许有null的键和值,效率较高,方法不是Synchronize的要提供外同步。有containsvalue和containskey方法。hashmap是java1.2引进的map interface的一个实现。是hashtable的轻量级实现。
    hashtable,线程安全,不允许有null的键和值。效率稍低,方法是Synchronize的,有contains方法,hashtable继承于Dictionary类。hashtable比hashmap老
    35.spring的好处:
    一.轻量级框架
    二.控制反转,通过控制反转实现松耦合
    三.面向切面AOP,把应用业务逻辑和系统分开
    四.容器,spring包含并管理应用中对象的生命周期和配置
    五.MVC框架,强大的web框架
    六.事务管理,spring提供持续的事务管理接口,可以扩展到上至本地下至全局的事务管理。
    七.异常处理,spring提供方便的API将具体相关的异常处理,转化为一致的unchecked异常

    36.spring生命周期:
    bean建立,由beanfactory读取bean定义文件,并声称各个实例
    setter注入,执行bean的属性依赖注入
    BeanFactoryAware的seBeanName(),如果实现该接口,则执行setbeanname方法
    BeanFactoryAwaredesetBeanFactory(),如果有关联pricessor,则在bean初始化之前都会执行这个实例的processBeforeInitialization()方法
    DisposableBean的destroy(),在容器关闭时,可以在bean定义文件中使用"destory-method"定义的方法

    37.如果使用ApplicationContextAware接口,则执行其setApplicationContext()方法,然后再进行BeanPostProcessors的processBeforeInitialiization()
    实际上,ApplicationContext除了向BeanFactory那样维护容器外,还提供更加丰富的框架功能,如Bean的消息,时间处理机制等。

    38.JSON开源库类:1.使用Jackson 2.Google-Gson类库
    3.JSON-lib类库 4.Flexjson类库
    5.Json-io类库 6.Genson类库
    7.JSONIJ类库

    39.git命令行:
    初始化文件夹=git init
    创建本地分支dev=git branch dev
    查看本地分支=git branch
    切换分支master=git checkout master

    40.maven命令打包war包:命令进入项目包pom.xml下,命令行输入: mvn package

    41.JVM内存划分:java栈,本地方法栈,程序计数器,堆,方法区

    42.jvm中堆空间可以分为三个区,新生代,老生代,永久代
    新生代刻划分为三个区,Eden区,两个幸存区。在jvm运行时,可以通过配置参数来改变整个JVM堆的配置比例。配置有:jvm运行时堆的大小,新生代堆空间大小,永久代大小和其他

    43.JVM运行时数据区:
    1.PC寄存器:用于存储每个线程下一步将执行的JVM之令。PC指当前指令的地址。JVM用PC来追踪指令执行的位置,PC实际上是指向方法区的一个内存地址。
    2.jvm栈:栈是线程私有的,每个线程创建的同时都会创建jvm栈,栈中存放的是当前局部基本类型的变量,部分的返回结果以及StackFrame,非基本类型的对象在栈上仅存放一个指向堆上的地址。
    3.堆:它是jvm来存储对象实例以及数组值的区域,可以作为java中所有通过new创建的对象的内存都在此分配,heap中的对象的内存需要等待GC进行回收。
    4.方法区域:这里存放了所加载的类的信息,类中的静态变量,类中定义为final的变量、类中的field信息、类中的方法信息,开发人员在程序中通过class对象中的get,isinterface等方法来获取信息,数据全部来源于方法区,同时方法区也是全剧共享,在异地你条件下会被GC,方法区需要使用内存超过允许大小,会抛出outofmemory的错误信息
    5.运行时常量池:存放的是类中的固定常量信息,方法和field的引用信息等。其空间从方法区分配。
    6.本地方法栈:jvm采用本地方法堆栈来支持native方法,此区域用于存储每个native方法调用的状态。

    44.JVM-GC:将内存中不再被使用的对象进行回收,GC中用于回收的方法叫收集器,由于GC需要消耗一些资源和时间,在java对对象的生命收起进行分析后,按照新生代、旧生代的方式来对对象进行收集,尽可能缩短GC对应用造成的暂停。

    45.JVM优化原则:尽量减少YoungGC,尽量减少FullGC。
    优化方法:一、代码角度,缩短对象生命期,尤其是大对象。二、JVM参数角度,优化JVM参数以减少YGC/FGC次数,可替换收集器。
    解决youngGC问题:把用Arraylist存储信息体采用hashmap,map中的key是uudi,value是消息本体。这样可以大大增加并发性能。 采用AtomicInteger来保存当前map中消息内容的大小。 当map中的消息体总大小到达阈值后,将当前map中所有key取出,然后将map中的数据封装到一条消息中,将当前map中的信息体大小置为0,然后for循环删除已成功发送的key。

    46.内存泄漏以及解决方法:
    系统崩溃前的一些现象:*垃圾回收时间变长,fullGC时间变长。*fullgc次数变多 *年老代的内存越来越大斌且每次fullgc年老代内存没有释放
    经过以上三点系统会无响应,逐渐达到OutOfMemory临界值

    ---恢复内容结束---

    1.++i 先计算后输出
    2.arraycopy(a,2,b,2,2) 从a数组第二位复制两位替换掉b数组第二位后两位
    3.java独特特点,平台无关性。
    4..java文件编译成.class文件
    5.读取图片文件可使用
    6.linkedhashset会保留顺序,treeset会自动排序。
    7.java变量名不能是数字,不能是关键字。
    8.private表示私有,只能在本类中使用。
    9.对象需要跨网络传输,需要实现Serializable接口
    10.生命抽象方法不可写大括号。
    11.count+=i 表示count=i+count
    12.spring boot框架,其实他不算是一个框架,他算是整合了多个框架。他拥有自己的pom.xml和配置文件,通过配置文件或YML实现了对SSM或者其他框架的整合,通过一个application的main方法和注解启动spring boot。他的使用场景非常广泛,因为他整合多个框架,所以广泛应用在各种项目开发和分布式项目的搭建。一般是使用IDEA创建spring boot项目,然后勾选需要的maven依赖。遇到的坑:在创建完成后,无法启动spring boot项目。
    13.select sum(列名) from 表名 where //求综合
    select avg(列名) from 表名 where //求平均数
    select count(1) from 表名 where //次数
    select 列名 from 表名 where 列名> < //对比
    优化数据库方法:
    1.避免在子句中使用!=或<>判断,所以拆分语句
    2.添加索引。
    3.避免全表查询

    14.java中线程实现方式:
    1.classA继承thread,并重写run方法,new A.start(),启动线程
    2.classA实现Runnable接口,并覆盖run方法,new thread(new A()).start()0,启动线程。
    15.i=12;
    i+=i-=i*=i (结果为-120)
    16.反射就是运行中的程序检查自己和软件运行环境的能力,它可以根据他发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。
    invoke()方法就是调用method类代表的方法,可以实现动态调用。
    17.linux系统中,Rm-r /mnt/tmp所代表的是删除文件夹中所有文件
    18.elasticSearch和solr类似,创建索引,全文检索的一个开源框架
    19.在java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
    20.对数据进行枷锁,程序先通过acquire获取锁来对数据排他访问,然后对数据进行一系列的操作最后释放锁。
    21.解决集群环境下session共享问题,有下面四种方案:(1).粘性session,每次都将同一用户的所有请求转发至同一台服务器上,用户与服务器绑定。(2).服务器session,每次session发生变化时,就广播给所有集群中的服务器,使所有服务器上的session相同.(3).session共享,缓存session,使用redis,memcached。(4).session持久化,将session存储到数据库中,向操作数据一样操作session。

    22.被final修饰的类无法被继承,被final修饰的方法无法被重写。被final修饰的值为常量。
    final关键字提高了性能,保证安全。使用final关键字,jvm会对方法变量及类进行优化。
    23.stringbuffer和stringbuilder的区别:他们两个方法功能完全等价,buffer中方法采用了synchronized关键字进行修饰,因此线程安全。同理builder线程非安全。 单线程程序下,builder效率更快,因为不需要加锁
    24. contructors 构造函数 applied 应用
    25. 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public,private,protected修饰。
    26.error是系统中的错误,程序员不能改变和处理,实在程序编译救赎先错误,仅靠程序本身无法恢复和预防,遇到这样的问题,建议终止程序。
    而exception是可以处理的异常,可以捕获可能恢复。遇到这类问题尽可能处理异常,是程序恢复
    27.GET请求=数据库select
    PUT请求=数据库update
    POST请求=数据库insert
    delete请求=数据库delete
    28.抽象类和接口的区别,一个是继承,一个是实现。抽象方法有public修饰,接口默认是public不可以修饰。抽象类可定义构造方法,也可以有抽象方法和具体方法。接口完全抽象无构造方法。extends继承抽象类,implements实现接口。
    29.方法的重写和重载是java多态性的不同表现。
    override(重写)特点:(1).子类方法名称,参数类型必须要和父类完全匹配,才能重写。(2).子类的方法返回值必须和父类相同,可以扩大不可缩小。(3).子类方法抛出异常,只能是父类抛出异常的子异常。(4).被private、final等关键字修饰不能被重写。(5)不是抽象方法不能被abstract修饰。
    overload(重载)特点:(1).再使用重载时只能通过不同的参数样式。(2).方法异常类型和数目不会对重载造成影响.(3).不能通过访问权限、返回类型、抛出异常进行重载。

    30.dependency injection=依赖注入
    实现依赖注入的不同方法:构造函数注入,设值注入。
    31.annotation=注解
    @Aspect 指定一个类为切面类
    @Before 前置通知:目标方法之前执行
    @AfterReturning 返回后通知:执行方法结束前执行
    @Around 环绕通知:环绕目标方法执行
    @AfterThrowing 异常通知:出现异常执行
    @After 后置通知:目标方法之后执行
    配置文件中添加<aop:aspectj-autoproxy/>元素,启用对于@AspectJ注解的支持
    @Conmponent 加入IOC容器

    32.当使用|时,若前面的表达式为真时,程序会继续执行后面的表达式,然后再得到true结果。
    ||时,若前面的表达式结果为真,则程序不会再执行后面的表达式,直接得出TRUE的结果。

    33.switch可作用于char,byte,short,int和他们对应的包装类。可作用于string类型,枚举类型。不可作用于long,double,float,boolean类型和他们的包装类。
    34. hashmap线程非安全,允许有null的键和值,效率较高,方法不是Synchronize的要提供外同步。有containsvalue和containskey方法。hashmap是java1.2引进的map interface的一个实现。是hashtable的轻量级实现。
    hashtable,线程安全,不允许有null的键和值。效率稍低,方法是Synchronize的,有contains方法,hashtable继承于Dictionary类。hashtable比hashmap老
    35.spring的好处:
    一.轻量级框架
    二.控制反转,通过控制反转实现松耦合
    三.面向切面AOP,把应用业务逻辑和系统分开
    四.容器,spring包含并管理应用中对象的生命周期和配置
    五.MVC框架,强大的web框架
    六.事务管理,spring提供持续的事务管理接口,可以扩展到上至本地下至全局的事务管理。
    七.异常处理,spring提供方便的API将具体相关的异常处理,转化为一致的unchecked异常

    36.spring生命周期:
    bean建立,由beanfactory读取bean定义文件,并声称各个实例
    setter注入,执行bean的属性依赖注入
    BeanFactoryAware的seBeanName(),如果实现该接口,则执行setbeanname方法
    BeanFactoryAwaredesetBeanFactory(),如果有关联pricessor,则在bean初始化之前都会执行这个实例的processBeforeInitialization()方法
    DisposableBean的destroy(),在容器关闭时,可以在bean定义文件中使用"destory-method"定义的方法

    37.如果使用ApplicationContextAware接口,则执行其setApplicationContext()方法,然后再进行BeanPostProcessors的processBeforeInitialiization()
    实际上,ApplicationContext除了向BeanFactory那样维护容器外,还提供更加丰富的框架功能,如Bean的消息,时间处理机制等。

    38.JSON开源库类:1.使用Jackson 2.Google-Gson类库
    3.JSON-lib类库 4.Flexjson类库
    5.Json-io类库 6.Genson类库
    7.JSONIJ类库

    39.git命令行:
    初始化文件夹=git init
    创建本地分支dev=git branch dev
    查看本地分支=git branch
    切换分支master=git checkout master

    40.maven命令打包war包:命令进入项目包pom.xml下,命令行输入: mvn package

    41.JVM内存划分:java栈,本地方法栈,程序计数器,堆,方法区

    42.jvm中堆空间可以分为三个区,新生代,老生代,永久代
    新生代刻划分为三个区,Eden区,两个幸存区。在jvm运行时,可以通过配置参数来改变整个JVM堆的配置比例。配置有:jvm运行时堆的大小,新生代堆空间大小,永久代大小和其他

    43.JVM运行时数据区:
    1.PC寄存器:用于存储每个线程下一步将执行的JVM之令。PC指当前指令的地址。JVM用PC来追踪指令执行的位置,PC实际上是指向方法区的一个内存地址。
    2.jvm栈:栈是线程私有的,每个线程创建的同时都会创建jvm栈,栈中存放的是当前局部基本类型的变量,部分的返回结果以及StackFrame,非基本类型的对象在栈上仅存放一个指向堆上的地址。
    3.堆:它是jvm来存储对象实例以及数组值的区域,可以作为java中所有通过new创建的对象的内存都在此分配,heap中的对象的内存需要等待GC进行回收。
    4.方法区域:这里存放了所加载的类的信息,类中的静态变量,类中定义为final的变量、类中的field信息、类中的方法信息,开发人员在程序中通过class对象中的get,isinterface等方法来获取信息,数据全部来源于方法区,同时方法区也是全剧共享,在异地你条件下会被GC,方法区需要使用内存超过允许大小,会抛出outofmemory的错误信息
    5.运行时常量池:存放的是类中的固定常量信息,方法和field的引用信息等。其空间从方法区分配。
    6.本地方法栈:jvm采用本地方法堆栈来支持native方法,此区域用于存储每个native方法调用的状态。

    44.JVM-GC:将内存中不再被使用的对象进行回收,GC中用于回收的方法叫收集器,由于GC需要消耗一些资源和时间,在java对对象的生命收起进行分析后,按照新生代、旧生代的方式来对对象进行收集,尽可能缩短GC对应用造成的暂停。

    45.JVM优化原则:尽量减少YoungGC,尽量减少FullGC。
    优化方法:一、代码角度,缩短对象生命期,尤其是大对象。二、JVM参数角度,优化JVM参数以减少YGC/FGC次数,可替换收集器。
    解决youngGC问题:把用Arraylist存储信息体采用hashmap,map中的key是uudi,value是消息本体。这样可以大大增加并发性能。 采用AtomicInteger来保存当前map中消息内容的大小。 当map中的消息体总大小到达阈值后,将当前map中所有key取出,然后将map中的数据封装到一条消息中,将当前map中的信息体大小置为0,然后for循环删除已成功发送的key。

    46.内存泄漏以及解决方法:
    系统崩溃前的一些现象:*垃圾回收时间变长,fullGC时间变长。*fullgc次数变多 *年老代的内存越来越大斌且每次fullgc年老代内存没有释放
    经过以上三点系统会无响应,逐渐达到OutOfMemory临界值

    linux命令行:
    ls 查看目录,查看文件权限
    pwd 查看当前工作目录
    mkdir 创建文件夹
    rm 删除命令
    mv 移动文件或文件夹
    cat命令 显示整个文件,创建一个文件,将几个合并一个

    git命令行:
    add 新增
    commit 提交信息
    log 查看日志
    push 更新到github上
    status 对应文件夹中添加新有项

    47.代理模式:
    一、静态代理
    优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
    缺点:我们得为每一个服务都创建代理类,工作量大,不易管理。同时接口一旦发生变化,代理类也得相应修改。
    二、动态代理
    在动态代理中我们不需要再手动创建代理类,我们只需要编写一个动态处理器就可以。真正的代理对象由jdk再运行时为我们动态创建。
    优点:相较于静态代理,我们大大减少了开发任务,也减少了对业务接口的依赖,降低了耦合。
    缺点:无法摆脱仅支持interface代理的问题。
    三、CGLIB代理
    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有借口的类。我们就要使用CGLIB了。CGLIB采用了底层字节码的技术,原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截技术拦截所有类方法的调用,瞬时织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。JDK动态代理与CGLIB动态代理都是spring aop的基础
    总结:CGLIB创建的动态代理对象比JDK创建的动态代理对象性能更高,但是CGLIB创建代理花费的时间比JDK多很多。所以对于代理对象,因为无需频繁创建对象,用CGLIB合适,反之使用JDK方法要更为合适一些。同时由于CGLIB是采用动态创建子类的方法,对于final修饰的方法无法进行代理。

    48.分布式事务
    一、两阶段提交(2PC)
    优点:尽量保证了数据的强一致性,适合对数据强一致性的要求高的
    关键领域。
    缺点:实现复杂,牺牲了可用性,对性能影响大。不适合高并发高性
    能场景,如果分布式系统跨接口调用,目前没有实现方案。
    二、补偿事务(TCC)
    核心思想:针对每个操作,都要注册一个与其对应的确认和补偿操作
    。三阶段:try阶段主要对业务系统做检测及资源预留,confirm阶段主
    要是对业务系统做确认提交,try阶段成功并开始执行confirm阶段,默
    认confirm阶段不会出错。cancel阶段主要是在业务执行错误,需要回
    滚的状态下执行的业务取消,预留资源释放。
    优点:比2pc流程简单,数据一致性相对较差。
    缺点:在二三步中有可能失败,所以需要实现过程中写很多业务代码
    ,一些场景中,一些业务流程可能用TCC不太好定义处理。
    三、本地消息表
    业界使用最多,核心思想是将分布式事务拆分成本低事务进行处理。
    基本思路:信息产生放,需要额外建一个消息表,并记录消息发送状
    态。消息和业务数据要在一个事务里提交,也就是说他们要在一个数据
    库中,然后消息经过MQ发送到消费方。如果失败会重试发送。
    然后消息消费方需要处理这个消息,并完成自己的业务逻辑。此时如
    果本低事务处理成功,表名已经处理成功,如果失败,就尝试重试运行
    。如果都失败,可以给生产方发送一个业务补偿信息,通知生产方进行
    回滚操作。
    生产方和消费方定时扫描本低消息表,把还没处理完的消息或者失败
    信息再发一遍。如果有靠谱的自动到帐补偿逻辑,这种方案还是很实用

    优点:一种非常经典的实现,避免了分布式事务,实现了最终一致性

    缺点:消息表会耦合到业务系统中,如果没有封装好的解决方案,会
    有很多杂活需要处理。
    三、MQ事务消息
    四、sagas事务模型

  • 相关阅读:
    Ubuntu(以16.04 server版为例)在VMware上安装及网络配置
    Ubuntu上面python虚拟环境的配置及mysql和redis安装
    json和pickle
    sqlalchemy第四部分
    sqlalchemy第三部分
    sqlalchemy第二部分
    线程
    文件处理
    文件流
    集合框架类
  • 原文地址:https://www.cnblogs.com/lenlen/p/10109246.html
Copyright © 2011-2022 走看看