2016-02-26 23 views
0

我有一個Blob列的對象requestData和一個文本列「requestDataText」。 這兩個字段可能容納大數據。在我的示例中,blob數據大約爲1.2 MB,Text列保存與該Data相同的文本。保存大對象休眠時間過長

當我嘗試提交此單個實體時,大約需要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; 
} 

... 

} 
+0

如果從mysql CLI執行此操作,是否需要大致相同的時間? (在這種情況下,問題是數據庫,而不是休眠,如果可以從遠程CLI會話而不是服務器本身執行此操作)。數據庫是否「接近」應用程序? (只是想確保數據庫不在世界的另一邊)。幾年前,我使用Hibernate將文檔存儲在mysql上,並且需要幾毫秒來存儲和檢索它們。 – Augusto

+0

@August數據庫通過1Gbit本地網絡連接。由於Blob字段,我無法通過Mysql CLI插入 – kommradHomer

回答

0

我只注意到你開始交易,然後做一個saveOrUpdate()這或許可以解釋慢下來,因爲Hibernate會首先嚐試檢索來自DB行(如在此其它SO answer解釋)。

如果您知道該實體是否爲新呼叫save()以及您是否需要更新實體,請致電update()

另一個建議,但我不確定這是否適用於MySQL,如果您打算更新blob/clobs,請嘗試將Blob/clobs存儲在與存儲數據的不同表中。在過去,這種混合使MySQL運行緩慢,因爲它不得不調整分配給一行的'塊'的大小。因此,只有一個包含所有屬性和不同表的blob/clob表。如果表是隻讀的,則不是這種情況。

+0

BLOB字段和TEXT字段從不更新,只是讀取。在閱讀或處理它們時沒有性能問題。我會檢查您的「saveOrUpdate」建議並提供更新。 TY – kommradHomer