2014-09-24 57 views
0

我在hibernate中聲明瞭<property name="show_sql">true</property>。我讀了link中的標準輸出問題。標準輸出將消耗更多的內存。那麼如何show_sql功能將工作?。因爲我在服務器日誌stdout中查看過sql查詢。Hibernate show sql等於stdout

13:06:53,323 INFO [stdout] (http-/172.29.250.43:8080-7) Hibernate: select sampledata0_.idsample as idsample4_10_1_, sampledata0_.id as id1_9_1_, sampledata0_.id as id1_9_0_, sampledata0_.idsample as idsample4_9_0_, sampledata0_.sname as sname2_9_0_, sampledata0_.svalue as svalue3_9_0_ from sample_meta_data sampledata0_ where sampledata0_.idsample=? 
13:06:53,324 INFO [stdout] (http-/172.29.250.43:8080-7) Hibernate: select sampledata0_.idsample as idsample4_10_1_, sampledata0_.id as id1_9_1_, sampledata0_.id as id1_9_0_, sampledata0_.idsample as idsample4_9_0_, sampledata0_.sname as sname2_9_0_, sampledata0_.svalue as svalue3_9_0_ from sample_meta_data sampledata0_ where sampledata0_.idsample=? 

內部休眠假設使用System.out.println。那麼它會消耗更多的內存嗎? format_sqlshow_sql如何在內部工作?

回答

2

設置trueshow_sqlformat_sql不會佔用更多的內存,但他們將在SQL語句寫入到控制檯,以便它是費時。

documentation

所有SQL語句到控制檯。這是將日誌類別org.hibernate.SQL設置爲 以進行調試的替代方法。

例如true |假

所以,當你設置該屬性show_sqltrue然後冬眠打印的SQL語句中使用下面的方法來安慰:

Hibernate使用下面的方法用於顯示從SQLStatementLogger class,它在內部使用的SQL語句。

/** 
* Log a SQL statement string. 
* 
* @param statement The SQL statement. 
* @param style The requested formatting style. 
*/ 
public void logStatement(String statement, FormatStyle style) { 
    if (log.isDebugEnabled() || logToStdout) { 
     style = determineActualStyle(style); 
     statement = style.getFormatter().format(statement); 
    } 
    log.debug(statement); 
    if (logToStdout) { 
     System.out.println("Hibernate: " + statement); 
    } 
} 

在上述方法中,如果format_sql設置爲true那麼SQL語句將被格式化,否則格式化風格將不會應用。

現在,如果LOG級別設置爲DEBUG,則SQL語句會寫入日誌文件。如果您將show_sql設置爲true,則它將消息打印到控制檯。正如您在問題中提供的鏈接所述,與將數據打印到日誌文件相比,使用System.out.println會花費更多時間。

通常,當應用程序在生產中時,日誌級別將不會設置爲DEBUG,因爲向日志文件寫入消息需要一些時間。

+0

「會將SQL語句寫入控制檯」。但它也需要一些毫秒的時間來寫。 – ashokhein 2014-09-24 16:45:31

+0

@ashokhein,更新我的答案更詳細的說明,請檢查。 – Chaitanya 2014-09-24 17:29:58

0

當show_sql是ture時,語句將被打印到system.out;並且如果要將語句打印到文件log4j集中,則應將log4j.logger.org.hibernate.SQL的級別設置爲DEBUG