mysql - 保存大对象在 hibernate 时花费的时间太长

标签 mysql hibernate blob

我有一个包含 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/

相关文章:

java - 为什么 Hibernate 要求列表索引可以为空?

java - 如何避免 Hibernate 中的旧式外部连接(+)?

mysql - 非法参数异常 : Type cannot be null (in JAVA)

Jquery - CodeIgniter 如何为 blob 提供文件扩展名

mysql - 如何在mysql中插入blob数据

mysql - 引用其他表查看日期范围内的记录

php - MySQL 全文搜索 - 数值和 ft_min_word_len 的解决方法

android - 从 SQLite 数据库中获取 Blob

mySQL 获得 n 级附属机构

java - Spring数据与关系表的序列化