JPA框架中jpql最后的了解

7 篇文章 0 订阅

E-R图(数据库工具生成的关系图)

E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型

jpql

jpql:jpa 持久化的查询语言,它和sql是类似,但是还是有区别

jpql规范写法:

​ (1) jpql 不能出现*号,必须出现对象的别名和属性名区分大小写

(2)jpql的关键字和sql一样,不分区大小写

3.分页查询

sql里面怎么分页:

​ select * from t_table limit beginIndex,pageSize

beginIndex:开始位置

pageSize:每页显示的条数

beginIndex = (currentPage-1)*pageSize;

4 事务并发(概念)

4.1 什么叫事务

一组操作 要么都成功 要么都失败

4.2 事务特性

ACID

​ 原子性: 事务这个单元它已经是最小单元,不能在去分割

一致性 : 数据一致性,操作之前,如果金额是10000,操作完之后,金额也应该是10000

隔离性 : 事务和事务之间,他们是相互隔离的,你的事务,不能操作我的事务,不然出现事务并发

持久性 :当前事务commit的时候,就把数据永久存储下来;

4.3事务并发

事务并发:有多个事务同时操作同一个数据的时候,就会出现事务并发问题

4.4事务并发带来的问题

事务并发:

​ 第一类丢失更新 ,第二类丢失更新。第一类丢失更新和第二类丢失更新,现象是差不多

​ 第一类丢失更新:一个人投一票,另外一个人又撤销 – 投的票丢失

​ 第二类丢失更新:明明两个人都投了一票,但是只有一票有效

-----------程序可以处理第一类丢失更新第二类丢失更新

​ 脏读

1.张三的原工资为4000, 财务人员将张三的工资改为了8000(但未提交事务)

2.张三读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!(在缓存中读取)

3.而财务发现操作有误,回滚了事务,张三的工资又变为了4000 像这样,张三记取的工资数8000是一个脏数据。

指一个线程中的事务读取到了另外一个线程中未提交的数据。

解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。

虚读

指一个线程中的事务读取到了另外一个线程中提交的update的数据。

幻读

指一个线程中的事务读取到了另外一个线程中提交的insert的数据。

目前工资为4000的员工有10人。

1.事务1,读取所有工资为4000的员工。

2.这时事务2向employee表插入了一条员工记录,工资也为4000

3.事务1再次读取所有工资为4000的员工共读取到了11条记录,

解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。

不可重复读

-------- 脏读 虚读 不可重复 交给数据库处理,数据库事务隔离级别–数据库管理员dba (运维范畴)

(oracle dba 2000$ 培训还–会计师)

------ 一般不建议你去修改隔离级别 除非你是数据库dba

4.5 数据库隔离级别

READ UNCOMMITTED(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。

READ COMMITTED 允许幻想读,不可重复读,不允许脏读

REPEATABLE READ(repeatable) 允许幻想读,不允许不可重复读和脏读

SERIALIZABLE 幻想读、不可重复读和脏读都不允许

4.6 第一类丢失更新和第二类丢失更新

第一类丢失更新

库存是1件

当事务A和事务B同时修改某行的值,

1.事务A将数值改为0并提交,购买了一件

2.事务B将数值改为0并提交,也购买了一件。这时数据的值为0,事务A所做的更新将会丢失。(相当于就卖出去2件商品)

解决办法:对行加锁,只允许并发一个更新事务。(JPA中的悲观锁,乐观锁)

第二类丢失更新

多个事务同时读取相同数据,并完成各自的事务提交,导致最后一个事务提交会覆盖前面所有事务对数据的改变

悲观锁: Lock 一般不用

​ 相当于同步效果, 如果一个人操作数据的时候,先把数据锁住,另外一个人必须等待我操作完,释放锁之后,才能进行操作

​ 弊端:如果效率很低

​ 底层: 可以锁行

​ transaction;

​ begin:

​ select * from t_employee where id=1 for update;

​ …

​ update t_employee set money =money+1000;

commit;

乐观锁:

​ 乐观锁 不会锁数据,通过版本号机制

如何优化JPA

​ 经验:

  1. 使用双向一对多关联,不使用单向一对多–效率高一点

  2. 灵活使用单向多对一关联 --多方来维护效率高一点

  3. 不用一对一,用多对一取代(不要使用共享主键一对一,使用唯一外键一对一)

  4. 配置对象二级缓存(配置 Cacheable),查询缓存(jpql查询),没有查询条件才使用查询缓存(如果有条件命中是很低)

  5. 组合关系集合使用list(顺序,重复)–第二个项目 单据模块,多对多集合使用set

  6. 表字段要少,表关联不要怕多,有二级缓存撑腰,设计表尽量达到第三范式(外键)

JPA难在什么地方 -> 细节(练,思考)太多了,性能太难控制了(经验)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值