我在hibernate中声明了<property name="show_sql">true</property>
。我在这个link中读到了stdout问题。 Stdout将消耗更多内存。那么 show_sql 功能如何运作?因为我在服务器日志stdout中看到了sql查询。
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_sql
和show_sql
如何在内部工作?
答案 0 :(得分:3)
为true
和show_sql
设置format_sql
不会消耗更多内存,但会将SQL
语句写入控制台,因此非常耗时。
将所有SQL语句写入控制台。这是设置的替代方案 要调试的日志类org.hibernate.SQL。
e.g。是的|假
因此,当您将属性show_sql
设置为true
时,hibernate会使用以下方法将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
,因为将消息写入日志文件需要一些时间。
答案 1 :(得分:0)
当show_sql是ture时,语句将被打印到system.out;如果你想将语句打印到log4j文件集中,你应该将log4j.logger.org.hibernate.SQL的级别设置为DEBUG