分布式意味着跨服务,事务注解将失效。
我们需要一套分布式事务方案,尽管我们实际开发要减少发生分布式事务(选择一个服务实现事务就可以用事务注解)
方案:A系统发送半事务到mq,执行本地事务,对A事务进行会查,如果执行成功,则由半事务-----》全事务。只要commit才会投递
command: ["java", "-Xms2048M", "-Xmx2048M", "-Xmn1024M", "-Xss1M", "-XX:MetaspaceSize=256M",
"-XX:MaxMetaspaceSize=256M", "-XX:+UseParNewGC", "-XX:+UseConcMarkSweepGC",
"-XX:+PrintGCDetails", "-Xloggc:gc.log", "-XX:+HeapDumpOnOutOfMemoryError" , "-XX:HeapDumpPath=/tmp",
"-jar", "/app.jar", "--spring.profiles.active=prod"]
B+tree上存储是以Key-value的方式存储的,key就是索引建立的字段的值,value就是指针,即节点指向子节点的那个指针(存储着子节点的存储地址)。
每一个叶子结点没有指针(除了横向的指针),其中存储的是数据。
这个数据,在INNODB中(聚簇索引),就是我们真正的数据,因为聚簇索引的数据文件和索引文件是一体的,一句话说,INNODB存储数据的形式就是采用的是这样一棵树,并且每个节点的KEY就是表的主键,因此,INNODB必须要有主键,即使你不建立,它也会自动为你维护一个主键,不过,这个自动的主键你应该是看不到的
所以,对于innodb存储引擎来说,我们使用自增主键的效果就很明显了,由于数据库本身的数据结构是依靠着主键去进行构建的,因此,当我们使用在自增主键的时候,我们会发现事半功倍。
另外,由于整颗树的每一层是顺序构建的,当我们使用字符串来存储数据的时候,我们就会需要首先将字符串转化为ascll码值进行比较,这是不仅会再次消耗性能,而且当我们在插入一个字符串主键的时候,若是需要将当前字符串插入到已经之前的节点中,那么就需要巨大的的改动,因此会带来整体的数据迁移和结构重构,这样损失的性能是超级强大。
这种就是MYISAM存储引擎 ,大家可以看到叶子结点中存储的是一个地址,这个地址要去另外的文件中获取信息。由于数据和索引是分离的,因此,MYISAM成为非聚簇索引
https://blog.csdn.net/f234344435/article/details/125315271
@SuppressWarnings("PMD")
//CHECKSTYLE:OFF
public void test() {
}
//CHECKSTYLE:ON
一级:频繁常用
@RequestMapping
@GetMapping
@PostMapping
@RestController
@Service
@Mapper
@Repository
@Slf4j
@Compent
@ResponseBody
@PathVariable
@RequestParam
@Bean
@Before
@After
@Transactional
@Configuration
@Resource
@Autowired
@SpringBootApplication
@SpringBootTest
@Test
@Override
@Value
二级:经常用
@PutMapping
@DeleteMapping
@MapperScan
三级:一般用
@Import 引用
@CofigurationProperties
@EnableConfiguratioProperties
1、抛出检查异常导致事务不能正确回滚
原因:Spring默认只会回滚非检查异常
解决:配置rollbackFor属性
2、业务方法内自己try-catch异常导致事务不能正确回滚
原因:事务通知只有捉到了目标抛出异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决1 异常原样抛出
2 手动设置TransactionStatus.setRollbackOnly()
3、aop切面顺序导致事务不能正确回滚
原因:事务切面优先级最低,但如果自定义的切面优先级和他一样,还是自定义切面在内层,这时若自定义切面没有正确抛出异常。。。
解决1 异常原样抛出
2 手动设置TransactionStatus.setRollbackOnly()
4、非public方法
spring创建代理,添加事务通知都需要定义public
解决:改为public
1、JVM有哪些内存区域
二、JVM对空间大小怎么配置?各区域怎么划?
新生代:短时间生成,可以马上回收
老生代:少部分对象会存在很久,回收策略应不同
三、JVM哪些内存区域会发生内存溢出(程序计数器不会)
OutOfMemoryError
1、栈溢出 虚拟机栈累计,每个线程最多占用1m内存,线程个数越来越多,而且又长时间不销毁
2、堆溢出 堆内存耗尽,对象越来越多,又一直使用,不能被垃圾回收
3、方法区溢出 方法区内存耗尽,加载的类越来越多,很多框架都会在运行期间动态产生新的类。
4、本机直接内存溢出
StackOverflowError 虚拟机栈内部,方法调用次数过多
大部分错误使用死for循环,递归;或者内存本身设置不够,随着接口越写越多,需要修改内存设置。
项目中什么情况会内存溢出,怎么解决的
1、误用线程池导致的内存溢出---------》别自己套用官方的线程池工具创建,自己定义一下有界条件。
2、查询数据量太大导致的内存溢出-----》设置增大内存
3、动态生成类导致的内存溢出----》new对象放里面,如果内存快超出了,它会重新new对象,老的对象会被自动回收,从而规避内存溢出
四、JVM在创建对象采用了哪些并发安全机制?
默认 (本地线程分配缓冲机制)
也可以设置cas+失败重试(乐观锁)
五、为什么不用Finalize
1、执行线程优先级很低
2、只能执行一次
六、jvm内存参数题目
七、java jvm 内存监控软件
软件有很多 java 监视和管理控制台,华为云等自带的控制台
四级:很少用
@Mapping
聚簇索引
同 MyISAM 引擎不同,InnoDB 的数据文件本身就是索引文件,表数据文件本身就是按 B+ 树组织的一个索引结构,其叶子节点的键值就是表的主键,这种数据存储方式也被称为聚簇索引。由此可见,聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。
聚簇索引的叶子节点都包含主键值、事务 ID、用于事务 MVCC 的回滚指针以及所有的剩余
辅助索引
辅助索引也叫非聚簇索引,二级索引等。同 MyISAM 引擎的辅助索引实现不同,InnoDB 的辅助索引,其叶子节点存储的不是行指针而是主键值,得到主键值再要查询具体行数据的话,要去聚簇索引中再查找一次,也叫回表。这样的策略优势是减少了当出现行移动或者数据页分裂时二级索引的维护工作。
聚簇索引:
通常由主键或者非空唯一索引实现的,叶子节点存储了一整行数据
非聚簇索引:
又称二级索引,就是我们常用的普通索引,叶子节点存了索引值和主键值,在根据主键从聚簇索引查
1等待阻塞 wait
2 同步阻塞 synchronized
3 其他阻塞 sleep join
/**
* 反射获取常用的三种方式:
* Class c = Class.forName("完整类名带包名");
* Class c = Object.getClass(); //Object可具体
* Class c = T.class; T:String, Object....
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws NoSuchFieldException
*/
@Test
public void reflectTest() throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException {
System.out.println("-------------first way-------------");
Class c = Class.forName("com.shuwei.report.api.entity.Project");
Object obj = c.newInstance();
System.out.println(obj);
/**
* Project(merchantId=null, name=null, type=null, status=null, deletedFlag=null, province=null,
* provinceCode=null, city=null, cityCode=null, region=null, regionCode=null)
*/
System.out.println(c.getName());
System.out.println(c.getSimpleName());
System.out.println(JSON.toJSONString(c.getFields()));
System.out.println(JSON.toJSONString(c.getDeclaredFields()));
System.out.println(c.getDeclaredField("name"));
System.out.println(c.getModifiers());
System.out.println(JSON.toJSONString(c.getDeclaredMethods()));
System.out.println(JSON.toJSONString(c.getDeclaredConstructors()));
System.out.println(c.getSuperclass());
System.out.println(JSON.toJSONString(c.getInterfaces()));
Field name = c.getDeclaredField("name");
name.set(obj, "3333");
System.out.println(name.get(obj));
System.out.println("-----------------second way---------------------");
String a = "\"fdskl\"";
Class aClass = a.getClass();
System.out.println(aClass.getSimpleName());
System.out.println("---------------------------third------------------------------");
String d = "\"dkl\"";
Object s = JSON.parseObject(d, String.class);
System.out.println(JSON.toJSONString(s));
}