diyhi / bbs

巡云轻论坛系统包含论坛、问答模块。系统采用JAVA+MYSQL架构,自适应手机端和电脑端,界面简洁,性能高效。演示站:http://bbs3.diyhi.com
GNU Affero General Public License v3.0
976 stars 266 forks source link

挺多循环sql的地方 #8

Open vincenty1ung opened 4 years ago

vincenty1ung commented 4 years ago

image

diyhi commented 4 years ago

用户注册扩展信息需要支持搜索,就只能用这种结构储存数据

vincenty1ung commented 4 years ago

你可以用list批量保存啊

diyhi commented 4 years ago

JPA的保存接口只有em.persist(entity)这个吧,哪里支持List类型

vincenty1ung commented 4 years ago

我没有用过jpa规范下的数据层框架(hibernate,springboot jpa),还没有细看你的代码,不知道你这样循环调用save 每次的都是开启新的会话,去访问db,还是只有一个会话,如果是多个session不建议这样做,我用的比较low用mybatis,当出现批量操作时500size为一个阈值,也就是500数据集一个sql,500-1000第二个sql,不会出现for(sql执行ing)。

rabinchen commented 4 years ago

可以开启一个事务,批量插入吧

diyhi commented 4 years ago

在同一事务里循环提交最后是批量插入的

例如JPA插入日志里显示 insert into t1 (f1, f2, f3) values (?, ?, ?) insert into t1 (f1, f2, f3) values (?, ?, ?) insert into t1 (f1, f2, f3) values (?, ?, ?)

实际上查看MySQL的日志记录查询执行日志显示 2020-04-24T05:06:48.103800Z 99 Query insert into t1 (f1, f2, f3) values ('a1', 'b1', 'c1'),('a2', 'b2', 'c2'),('a3', 'b3', 'c3')

主要是这两个配置起了作用: persistence.xml文件的 <property name="hibernate.jdbc.batch_size" value="10"/>

druid.properties文件的 rewriteBatchedStatements=true

设置以上参数后,MySQL驱动会将插入语句重新组合再提交

附开启MySQL日志方法

MySQL查询日志功能是否开启 SHOW VARIABLES LIKE 'general%';

general_log:日志功能是否开启,默认关闭OFF general_log_file:日志文件保存位置

开启日志 set GLOBAL general_log='ON';

查询是否开启 SHOW VARIABLES LIKE 'general_log';

重启MySQL服务后需要重新配置

`mysql> SHOW VARIABLES LIKE 'general%'; +------------------+-------------------------+ | Variable_name | Value | +------------------+-------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/test.log | +------------------+-------------------------+ 2 rows in set (0.01 sec)

mysql> set GLOBAL general_log='ON'; Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'general_log'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | general_log | ON | +---------------+-------+ 1 row in set (0.01 sec)`