【问题标题】:Retrieve SQL queries performed by Hibernate检索 Hibernate 执行的 SQL 查询
【发布时间】:2012-12-08 17:19:18
【问题描述】:

我正在使用 Play Framework,我想检索 Hibernate 执行的查询。

我知道 application.conf (jpa.debugSQL=true) 中有一个设置可以在控制台中显示查询,但我想做的是从代码中检索这些查询,以便我自己为用户显示它们(就像网站中的管理界面,用于查看每个页面请求的查询)。

感谢您的帮助!

【问题讨论】:

    标签: hibernate jpa playframework playframework-1.x


    【解决方案1】:

    如果您熟悉 log4j(或任何其他类似的日志框架),这应该很容易实现。

    您可以编写一个自定义附加程序,将其配置为接收来自org.hibernate.SQL 的所有事件(这是提供 SQL 输出的包)。此附加程序会将所有事件放入some FIFO buffer。这将允许您将最后的 n 日志条目保留在内存中。

    我猜剩下的就是在你的 webapp 中显示缓冲区内容一样简单。

    编辑:事情可能是什么样子的示例:

    log4j 配置:

    <appender name="backend-appender" class="your.package.BackendAppender">
       <param name="bufferSize" value="200"/>
       <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="[%t]: %m - %c - %d %x%n"/>
       </layout>
    </appender>
    

    Java 代码:

    public class BackendAppender extends AppenderSkeleton {
       private Collection<LoggingEvent> buffer;
       private int bufferSize = 10;
       private Layout layout;
    
       @Override
       protected void append(LoggingEvent event) {
           buffer.add(event);
       }
    
       public void close() {
       }
    
       public boolean requiresLayout() {
          return false;
       }
    
       @Override
       public void activateOptions() {
           if (buffer == null) {
              buffer = new CircularFifoBuffer<>(bufferSize);
           }
           layout = getLayout();
       }
    
       public List<String> getHibernateLog() {
          List<String> list = new ArrayList<>();
          for (LoggingEvent event : buffer) {
              if (event == null) {
                  continue;
              }
              list.add(layout.format(event));
              // check event.getThrowableInformation() -- it signals this was an exception rather than typical log line and you need to handle this differently
    
          }
       }
    

    【讨论】:

    • 谢谢,我会看的。如果你有一个例子给我看,那就更好了!但无论如何,我会尝试使用你的答案来解决我的问题,如果我成功了,我会回来告诉你
    猜你喜欢
    • 2015-08-29
    • 2013-01-04
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多