以下为 JDBC 和 MyBatis 的性能比较参考,MyBatis 的性能比 JDBC 大概慢三分之一,看上去相差挺大的,不过网络才是对效率影响最大的因素,局域网中有 200 多倍的影响,这么比较起来,MyBatis 和 JDBC 本身的效率差距可以忽略不计了。
测试 2 种情况 (每条记录有 7 个字段)
- 向本机的数据库插入 66720 条记录
- 向局域网中其他机器上的数据库插入 20000 条记录
在向局域网中其他机器上不停的插入数据时,2 台机器的 CPU 占用都很小,也就百分之几,因为大多数时候都在等待 IO。
使用 JDBC 和 MyBatis 向本机的数据库插入数据
JDBC
不使用事务: 插入 66720 个,使用了 11827 毫秒,11 秒
使用事务,500 个提交 1 次: 插入 66720 个,使用了 5256 毫秒,5 秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30public void insertEnrollments() throws Exception {
new Executor(enrollmentService).execute((enrollments) -> {
Connection conn = DbUtils.getConnection();
for (Enrollment enrollment : enrollments) {
insertEnrollment(enrollment, conn);
}
DbUtils.close(null, null, conn);
});
}
public void insertEnrollmentsWithTransaction() throws Exception {
new Executor(enrollmentService).execute((enrollments) -> {
int length = enrollments.size();
Connection conn = DbUtils.getConnection();
conn.setAutoCommit(false);
for (int i = 0; i < length; i++) {
insertEnrollment(enrollments.get(i), conn);
if (i > 0 && i % MAX_COUNT == 0) {
conn.commit();
}
}
conn.commit();
DbUtils.close(null, null, conn);
});
}
MyBatis
不使用事务: 插入 66720 个,使用了 12872 毫秒,12 秒
使用事务,1 个提交 1 次: 插入 66720 个,使用了 23286 毫秒,23 秒
使用事务,500 个提交 1 次: 插入 66720 个,使用了 6853 毫秒,6 秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public void insertEnrollment(Enrollment enrollment) {
mapper.insertEnrollment(enrollment);
}
public void insertEnrollmentWithTransaction(Enrollment enrollment) {
mapper.insertEnrollment(enrollment);
}
public void insertEnrollmentsWithTransaction(List<Enrollment> enrollments) {
for (Enrollment enrollment : enrollments) {
mapper.insertEnrollment(enrollment);
}
}
使用 JDBC 和 MyBatis 向局域网里其他机器上的数据库插入数据
JDBC
使用事务,500 个提交 1 次: 插入 20000 个,使用了 614386 毫秒,614 秒
本机时只使用了 2307 毫秒,2 秒
MyBatis
使用事务,500 个提交 1 次: 插入 20000 个,使用了 804749 毫秒,804 秒
本机时只使用了 3216 毫秒,3 秒