首页 » 2019年7月

jpa报错,Table 'DBNAME.hibernate_sequence' doesn't exist,这个解决办法是加上自增

尝试如下:

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;

或者配置

spring:
  jpa:
    hibernate:
      use-new-id-generator-mappings: false

这个报错是因为kafka server的版本过低,建议更换kafka server

完整报错

java.lang.IllegalArgumentException: Magic v1 does not support record headers
    at org.apache.kafka.common.record.MemoryRecordsBuilder.appendWithOffset(MemoryRecordsBuilder.java:403)
    at org.apache.kafka.common.record.MemoryRecordsBuilder.appendWithOffset(MemoryRecordsBuilder.java:442)
    at org.apache.kafka.common.record.MemoryRecordsBuilder.append(MemoryRecordsBuilder.java:499)
    at org.apache.kafka.common.record.MemoryRecordsBuilder.append(MemoryRecordsBuilder.java:522)
    at org.apache.kafka.clients.producer.internals.ProducerBatch.tryAppend(ProducerBatch.java:107)
    at org.apache.kafka.clients.producer.internals.RecordAccumulator.append(RecordAccumulator.java:222)
    at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:814)
    at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:768)
    at org.springframework.kafka.core.DefaultKafkaProducerFactory$CloseSafeProducer.send(DefaultKafkaProducerFactory.java:384)
    at brave.kafka.clients.TracingProducer.send(TracingProducer.java:106)
    at org.springframework.kafka.core.KafkaTemplate.doSend(KafkaTemplate.java:368)
    at org.springframework.kafka.core.KafkaTemplate.send(KafkaTemplate.java:183)
    at tv.rr.messaging.KafkaMessageProducer.sendMessage(KafkaMessageProducer.java:38)
    at tv.rr.messaging.KafkaMessageProducer$$FastClassBySpringCGLIB$$8cc6427f.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
    at org.springframework.cloud.sleuth.instrument.async.TraceAsyncAspect.traceBackgroundThread(TraceAsyncAspect.java:65)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java)
    at org.springframework.cloud.sleuth.instrument.async.TraceRunnable.run(TraceRunnable.java:62)
    at java.lang.Thread.run(Thread.java:748)

1.mysql 的隔离级别和锁

  • mysql 的锁分为共享锁(又叫S锁)和拍他锁(又叫X锁),S锁----允许多个事务并发的读取同一个资源,互补干扰。X锁----事务T加上排他锁后,其他事务不能再加任何锁。
  • read uncommit ---没有锁,所以会出现脏读
  • read commit ----共享锁,允许读,但是不允许写。---会出现,不可重复读(一个事务范围内,多次读取的结果不一样)
  • 可重复读--- X锁,读写都不允许,保证了可重复读。但是不能保证幻读,mysql引入了mvcc来解决这个问题。
    2.Spring bean的生命周期
  • instantiation ---实例化
  • properties injection ---属性注入
  • setBeanName ---of bean name Aware接口的实现调用
  • setBeanClassLoader----BeanClassLoaderAare接口的方法
  • setBeanFactory ----BeanFactoryAware接口
  • PostProcessBeforeInitialization-----BeanPostProcessor接口
  • afterPropertiesSet-----InitializingBean 接口
  • 自定义的init-method----在spring xml中
  • postProcessAfterInitilazation ---BeanPostProcessor接口
  • destroy----DisposableBean 接口
  • 自定义的destroy method
    3.设计一个抢红包系统
  • 用redis + lua https://www.jianshu.com/p/b58ed2fe6976?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
  • 原理:生成一个正太分布的红包值,比如100元,生成10个包。然后利用redis+lua的原子性,把hongbaoList(-1操作),hongbaoConsumedList(+1操作),hongbaoConsumedMap(去重操作)放在一起执行。 注意jedis是和某太机器建立会话,发送lua脚本,采用用redis单线程来保证原子性和抢红包的单线程竞争。
    4.分布式锁的公平竞争、线程锁的公平竞争
  • 大多是通过单机,或者单线程里面的锁或者时钟顺序性来保证。
  • zookeeper在一个指定节点的lockpath下创建临时会话顺序节点(类似于mysql的自增)。谁创建的节点序号小,谁有限获得锁。其他节点都会监听比自己小的节点,在监听事件中判断自己是否最小,从而获得锁
  • redis 通过lua的原子性脚本,保证setnx+pexpire的执行原子性(防止没有expire,其他获取锁的机器渴死),类似与MULTI / EXEC 和单线程来保证事务,其实利用了单线程带来的隔离性,串行化,不被打断。不算严格的原子性
  • mysql的唯一键保证,其他线程不能插入
  • 线程的公平竞争,使用队列,公平不允许插队,非公平允许插队。见问题8
    5.线程wait和sleep的区别

6.dubbo自定义注解的实现

  • 调用端---- 实现spring提供的NamespaceHandler 接口,向Spring 容器注册 BeanDifinationParser,通过parser转换相关的xml到Spring 的bean
  • 服务端----- Service Bean,dubbo服务提供者都实现 dubbo:service,Spring把 dubbo:service 解析成一个ServiceBean,ServiceBean实现了ApplicationListener和InitializingBean接口,afertPorpertiesSet中调用export方法暴露这些服务方法。即注册到provider的map里面

7.类的加载
8.ReentrantLock 机制,公平和非公平

9.DDD理解,战略,战术

  • 首先领域---就是问题域,即我们要研究的问题边界,不要把所有问题放到一起,我们的问题有自己的边界,是为领域。首先我们系统要做成什么样,然后对问题进行拆分,划分边界,成为领域。比如一个电商可以接拆为---会员中心,商品中心,订单中心,交易中心,库存中心,营销促销中心。但是领域划分有时候会产生领域复杂问题,比如商品中心,有商品和库存,那么随着维护困难,可以再次拆分子领域,也就是我们常说的垂直切分。会员包括用户和账户,也可以垂直切分。
  • 按功能可以分为核心域(赚钱的)、通用域、支撑域
  • 战略是对系统整体的规划,划分,DDD的战略设计主要包括领域/子域、通用语言、限界上下文和架构风格等概念。
  • 战术是设计模式,领域对象,entity,值对象。聚合。Domain Service,Repository,Domain Event