Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

挺多循环sql的地方 #8

Open
vincenty1ung opened this issue Nov 19, 2019 · 6 comments
Open

挺多循环sql的地方 #8

vincenty1ung opened this issue Nov 19, 2019 · 6 comments

Comments

@vincenty1ung
Copy link

image

@diyhi
Copy link
Owner

diyhi commented Nov 19, 2019

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

@vincenty1ung
Copy link
Author

你可以用list批量保存啊

@diyhi
Copy link
Owner

diyhi commented Nov 20, 2019

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

@vincenty1ung
Copy link
Author

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

@rabinchen
Copy link

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

@diyhi
Copy link
Owner

diyhi commented Apr 24, 2020

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

例如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)`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants