2012-10-04 9 views
8

Tôi cần gỡ lỗi ứng dụng Grails với một yêu cầu thực sự chậm. Tôi có đăng nhập SQL nhưng muốn xem số lượng truy vấn SQL mà không cần đếm chúng theo cách thủ công.Làm cách nào để đếm số lượng truy vấn SQL hibernate có trong một yêu cầu Grails?

debug 'org.hibernate.SQL' 
trace 'org.hibernate.type' 

Đối eaxmple có dòng sau sau mỗi yêu cầu (trong đó x là số tiền của tất cả các truy vấn được đưa đến SQL server):

[2012/10/04 13: 41: 45.049] [LoggingFilters] INFO - Yêu cầu hoàn thành trong 8296 ms và thực hiện x câu lệnh SQL

Sau khi một số googling này dường như không thể với Grails để MySQL có thể cung cấp thông tin?

+1

Hãy xem [this] (http://johnrellis.blogspot.com/2012/06/ gpost-false-sense-of-simplicity.html) blogpost. Ở đây bạn có thể tìm thấy một lời giải thích tốt đẹp làm thế nào để kiểm tra số lượng truy vấn đến cơ sở dữ liệu. –

Trả lời

8

Bạn có thể làm điều đó bằng cách sử dụng Bộ lọc và thống kê Hibernate. Tạo lớp ExampleFilters.groovy trong thư mục conf. Đây là nội dung của lớp:

import org.hibernate.stat.Statistics 
class ExampleFilters { 

    def sessionFactory 


    def filters = { 
    // your filters here 

     logHibernateStats(controller: '*', action: '*') { 
      before = { 
      Statistics stats = sessionFactory.statistics; 
      if(!stats.statisticsEnabled) {stats.setStatisticsEnabled(true)} 
        } 

     afterView = { 
      Statistics stats = sessionFactory.getStatistics() 
      double queryCacheHitCount = stats.getQueryCacheHitCount(); 
      double queryCacheMissCount = stats.getQueryCacheMissCount(); 
      double queryCacheHitRatio = (queryCacheHitCount/((queryCacheHitCount + queryCacheMissCount) ?: 1)) 
      println """ 
######################## Hibernate Stats ############################################## 
Transaction Count:${stats.transactionCount} 
Flush Count:${stats.flushCount} 
Total Collections Fetched:${stats.collectionFetchCount} 
Total Collections Loaded:${stats.collectionLoadCount} 
Total Entities Fetched:${stats.entityFetchCount} 
Total Entities Loaded:${stats.entityFetchCount} 
Total Queries:${stats.queryExecutionCount} 
queryCacheHitCount:${queryCacheHitCount} 
queryCacheMissCount:${queryCacheMissCount} 
queryCacheHitRatio:${queryCacheHitRatio} 
######################## Hibernate Stats ############################################## 
""" 
      stats.clear() 
     } 

    } 

    } 

} 

Để đọc thêm về thống kê Hibernate khác nhau đọc bài viết này: http://www.javalobby.org/java/forums/t19807.html

Cũng lưu ý rằng có một tác động hiệu quả khi sử dụng này, vì vậy nó thực sự nên được sử dụng chỉ trong môi trường phát triển.

+0

Cảm ơn! Đây chính xác là tài nguyên tôi đang tìm kiếm! 'Thống kê' trong tài liệu hướng dẫn API Hibernate dường như là một nơi tốt để xem xét. – aarreoskari

+0

câu trả lời xuất sắc! –

+1

Xin chào, tôi đã biến nó thành [plugin Grails] (http://grails.org/plugin/log-hibernate-stats) trong trường hợp nó hữu ích! Ghi có vào [bài đăng gốc] (http://www.intelligrape.com/blog/2011/11/07/grails-find-number-of-queries-executed-for-a-particular-request/) bởi Himanshu Seth. – Igor

0

trong grails sử dụng loggingSql

dataSource { 
dbCreate = "update" // one of 'create', 'create-drop','update' 
url = "jdbc:postgresql://localhost:5432/demodb" 
loggingSql = true 
} 

bạn sẽ nhận thấy rằng tất cả các câu lệnh SQL Grails sử dụng sẽ được đăng nhập.

+1

Có, tôi đã bật tính năng loggingSql. Những gì tôi cần là số lượng các câu lệnh SQL cuối cùng. – aarreoskari

1

Bạn đã xem xét một số giải pháp công nghệ thấp như chạy đầu ra thông qua wc -l?

+0

Thật không may hibernate không in truy vấn trên mỗi dòng trong nhật ký. Nhưng bạn có thể đếm số lần xuất hiện của chuỗi "chọn". Tất nhiên bạn sẽ phải cắt bớt tệp nhật ký giữa mỗi phiên. Nhưng hoạt động như một giải pháp! – aarreoskari

0

Như Burt Beckwith nói trong bài viết trên blog của mình "Stuff Tôi học kinh nghiệm tư vấn" http://burtbeckwith.com/blog/?p=1570

SQL Logging

Có hai cách để xem kết quả SQL từ các truy vấn; thêm logSql = true trong DataSource.groovy và cấu hình logger Log4j. Cách tiếp cận Log4j linh hoạt hơn rất nhiều vì nó không chỉ đổ ra stdout và có thể được định tuyến tới một tệp hoặc ứng dụng khác và được bật và tắt một cách thuận tiện. Nhưng hóa ra rất dễ dàng để chuyển đổi logSql SQL console logging. Lấy tham chiếu đến bean sessionFactory (ví dụ: sử dụng tiêm phụ thuộc với def sessionFactory) và bật nó lên với

sessionFactory.settings.sqlStatementLogger.logToStdout = true 

and off with 

sessionFactory.settings.sqlStatementLogger.logToStdout = false 
+0

Cảm ơn.Tôi đã có Log4j thiết lập nhưng không có nó, đây sẽ là một cách nhanh hơn để có được một số thông tin gỡ lỗi. Cảm ơn. – aarreoskari