测试分两轮,同场景下默认参数做一轮,调优做强一轮,横纵对比分析了。
测试中尽保证输入输出的一致性。
样本量尽可能大,达到10万级别以上,减少统计误差。
=================================================================================================================================================================================================================================
具体的场景情况下
插入测试1:10万条记录插入。
查询测试1:100万数据中单表通过id查询100000次,无关联字段。
查询测试2:100万数据中单表通过id查询100000次,输出关联对象字段。
查询测试3:100万*50万关联数据中查询100000次,两者输出相同字段。
===============================================================================================================================================================================================================================
数据库:mysql 5.6
表格设计:
twitter:推特
CREATE TABLE twitter
(
id
bigint(20) NOT NULL AUTO_INCREMENT,
add_date
datetime DEFAULT NULL,
modify_date
datetime DEFAULT NULL,
ctx
varchar(255) NOT NULL,
add_user_id
bigint(20) DEFAULT NULL,
modify_user_id
bigint(20) DEFAULT NULL,
PRIMARY KEY (id
),
KEY UPDATE_USER_FORI
(modify_user_id
),
KEY ADD_USER_FORI
(add_user_id
),
CONSTRAINT ADD_USER_FORI
FOREIGN KEY (add_user_id
) REFERENCES user
(id
) ON DELETE SET NULL,
CONSTRAINT UPDATE_USER_FORI
FOREIGN KEY (modify_user_id
) REFERENCES user
(id
) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=1048561 DEFAULT CHARSET=utf8
user: 用户
CREATE TABLE user
(
id
bigint(20) NOT NULL AUTO_INCREMENT,
name
varchar(255) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=524281 DEFAULT CHARSET=utf8
测试数据准备:
表一:twitter
无数据。
表二:user
50万个随机的用户名。
随机内容推特表(material_twitter)
无id,仅有随机字符串内容,共10万条。
用于插入控推特表。此处插一句话,更多关于mybatis面试题,公众号Java精选,回复Java面试,获取mybatis面试题大全。支持在线刷题。
生成数据代码,关联100个用户:
insert into twitter(ctx,add_user_id,modify_user_id,add_date,modify_date)
SELECT name,ROUND(RAND()*100)+1,ROUND(RAND()*100)+1,‘2016-12-31’,‘2016-12-31’
from MATERIAL
生成数据代码,关联500000个用户:
insert into twitter(ctx,add_user_id,modify_user_id,add_date,modify_date)
SELECT name,ROUND(RAND()*500000)+1,ROUND(RAND()*500000)+1,‘2016-12-31’,‘2016-12-31’
from MATERIAL
实体代码
@Entity
@Table(name = “twitter”)
public class Twitter implements java.io.Serializable{
private Long id;
private Date add_date;
private Date modify_date;
private String ctx;
private User add_user;
private User modify_user;
private String createUserName;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = “id”, unique = true, nullable = false)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Temporal(TemporalType.DATE)
@Column(name = “add_date”)
public Date getAddDate() {
return add_date;
}
public void setAddDate(Date add_date) {
this.add_date = add_date;
}
@Temporal(TemporalType.DATE)
@Column(name = “modify_date”)
public Date getModifyDate() {
return modify_date;
}
public void setModifyDate(Date modify_date) {
this.modify_date = modify_date;
}
@Column(name = “ctx”)
public String getCtx() {
return ctx;
}
public void setCtx(String ctx) {
this.ctx = ctx;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = “add_user_id”)
public User getAddUser() {
return add_user;
}
public void setAddUser(User add_user) {
this.add_user = add_user;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = “modify_user_id”)
public User getModifyUser() {
return modify_user;
}
public void setModifyUser(User modify_user) {
this.modify_user = modify_user;
}
@Transient
public String getCreateUserName() {
return createUserName;
}
public void setCreateUserName(String createUserName) {
this.createUserName = createUserName;
}
}
开始
==
插入测试1
代码操作:
将随机内容推特表的数据加载到内存中,然后一条条加入到推特表中,共10万条。
关键代码:
hibernate:
Session session = factory.openSession();
session.beginTransaction();
Twitter t = null;
Date now = new Date();
for(String materialTwitter : materialTwitters){
// System.out.println(“materialTwitter=”+materialTwitter);
t = new Twitter();
t.setCtx(materialTwitter);
t.setAddDate(now);
t.setModifyDate(now);
t.setAddUser(null);
t.setModifyUser(null);
session.save(t);
}
session.getTransaction().commit();
mybatis:
Twitter t = null;
Date now = new Date();
for(String materialTwitter : materialTwitters){
// System.out.println(“materialTwitter=”+materialTwitter);
t = new Twitter();
t.setCtx(materialTwitter);
t.setAddDate(now);
t.setModifyDate(now);
t.setAddUser(null);
t.setModifyUser(null);
msession.insert(“insertTwitter”, t);
}
msession.commit();
TwitterMapper.xml,插入代码片段:
insert into twitter(ctx, add_date,modify_date) values (#{ctx},#{add_date},#{modify_date})
查询测试1
通过id从1递增到10万依次进行查询推特内容,仅输出微博内容。
关键代码:
hibernate:
long cnt = 100000;
for(long i = 1; i <= cnt; ++i){
Twitter t = (Twitter)session.get(Twitter.class, i);
//System.out.println(“t.getCtx=”+ t.getCtx() + " t.getUser.getName=" + t.getAddUser().getName());
}
mybatis:
long cnt = 100000;
for(long i = 1; i <= cnt; ++i){
Twitter t = (Twitter)msession.selectOne(“getTwitter”, i);
//System.out.println(“t.getCtx=”+ t.getCtx() + " t.getUser.getName=" + t.getAddUser().getName());
}
查询测试2
与查询测试1总体一样,增加微博的创建人名称字段,此处需要关联。
其中微博对应有10万个用户。可能一部份用户重复。这里对应的用户数可能与hibernate配懒加载的情况有影响。
最后
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性
Java面试宝典2021版
最常见Java面试题解析(2021最新版)
2021企业Java面试题精选
}
查询测试2
与查询测试1总体一样,增加微博的创建人名称字段,此处需要关联。
其中微博对应有10万个用户。可能一部份用户重复。这里对应的用户数可能与hibernate配懒加载的情况有影响。
最后
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性
Java面试宝典2021版
[外链图片转存中…(img-bkCFkGrm-1714492899484)]
[外链图片转存中…(img-FhZ8mtFa-1714492899484)]
最常见Java面试题解析(2021最新版)
[外链图片转存中…(img-EjRNKGWC-1714492899484)]
[外链图片转存中…(img-41lcw1jj-1714492899485)]
2021企业Java面试题精选
[外链图片转存中…(img-K6vPMdDX-1714492899485)]
[外链图片转存中…(img-xZW3AkIa-1714492899485)]