【问题标题】:saving large object takes too long on hibernate在休眠状态下保存大对象需要太长时间
【发布时间】:2016-06-09 14:30:46
【问题描述】:

我有一个带有 Blob 列 requestData 和文本列 "requestDataText" 的对象。 这两个字段可能包含大量数据。在我的示例中,blob 数据大约为 1.2 MB,Text 列包含与该数据等效的文本。

当我尝试提交这个单一实体时,大约需要 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;
}

...

}

【问题讨论】:

  • 如果您从 mysql CLI 执行此插入,是否需要大致相同的时间? (在这种情况下,问题是数据库,而不是休眠。如果您可以从远程 CLI 会话而不是服务器本身执行此操作)。数据库是否“接近”应用程序? (只是想确保数据库不在世界的另一端)。几年前我使用 Hibernate 在 mysql 上存储文档,存储和检索它们需要几毫秒。
  • @Augusto 数据库通过 1Gbit Local Network 连接。由于 Blob 字段,我无法通过 Mysql CLI 插入

标签: mysql hibernate blob


【解决方案1】:

我刚刚注意到您正在启动一个事务,然后执行 saveOrUpdate() 这可能会解释速度变慢,因为休眠将首先尝试从数据库中检索该行(如另一个 SO answer 中所述)。

如果您知道实体是否是新实体,请致电 save(),如果您必须更新实体,请致电 update()

另一个建议,但我不确定这是否适用于 MySQL,如果您打算更新 blob/clob,请尝试将 blob/clob 存储在与数据存储位置不同的表中。在过去,这种混合使 MySQL 运行缓慢,因为它必须调整分配给一行的“块”的大小。因此,有一个包含所有属性的表和一个仅用于 blob/clob 的不同表。如果表是只读的,则不是这种情况。

【讨论】:

  • BLOB 字段和 TEXT 字段永远不会更新,只是读取。并且在读取或处理它们时没有性能问题。我将检查您的“saveOrUpdate”建议并提供更新。 ty
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多