我有一个包含 Blob 列 requestData 和文本列 "requestDataText"的对象。 这两个字段可能包含大量数据。在我的示例中,blob 数据大约为 1.2 MB,文本列包含与该数据等效的文本。
当我尝试提交这个单个实体时,大约需要 20 秒。
DBUtil.beginTransaction();
session.saveOrUpdate(entity);
DBUtil.commitTransaction();
有什么问题或者有办法缩短这个时间吗?
package a.db.entity;
// Generated Feb 22, 2016 11:57:10 AM by Hibernate Tools 3.2.1.GA
/**
* Foo generated by hbm2java
*/
@Entity
@Table(name="foo"
,catalog="bar"
)
public class Foo implements java.io.Serializable {
private Long id;
private Date reqDate;
private byte[] requestData;
private String requestDataText;
private String functionName;
private boolean confirmed;
private boolean processed;
private boolean errorOnProcess;
private Date processStartedAt;
private Date processFinishedAt;
private String responseText;
private String processResult;
private String miscData;
public AsyncRequestLog() {
}
@Id @GeneratedValue(strategy=IDENTITY)
@Column(name="Id", unique=true, nullable=false)
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
...
}
最佳答案
我刚刚注意到你正在开始一个事务,然后执行一个 saveOrUpdate()
这可能解释了速度变慢的原因,因为 hibernate 将首先尝试从数据库中检索行(如上所解释的)其他 SO answer )。
如果您知道该实体是否是新实体,请调用 save()
,如果您知道实体必须更新,请调用 update()
。
另一个建议,但我不确定这是否适用于 MySQL,如果您打算更新 blob/clob,请尝试将 blob/clob 存储在与您存储数据的不同的表中。在过去,这种混合使 MySQL 运行缓慢,因为它必须调整分配给行的“ block ”的大小。因此,有一个包含所有属性的表和一个仅用于 blob/clob 的不同表。如果表是只读的,则不是这种情况。
关于mysql - 保存大对象在 hibernate 时花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35650635/