首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

精通 Grails 在企业中使用 Grails(4)

精通 Grails 在企业中使用 Grails(4)

查看 Hibernate DEBUG输出回到先前的假设,您正在调试一个实时 Grails 应用程序,但还没有找到您需要的东西。将根 MBean 的优先级属性设置回 ERROR来减少干扰。
可能问题就出在 Hibernate。再回过头看看 Config.groovy,您会发现 org.hibernate包的登录输出被设置为 off。不要改变整个应用程序的输出级别,而是集中于特定的包,这样可能会获得更多的信息。
在 JConsole 中,单击默认 MBean。除了更改属性值以外,您还可以调用 MBean 上的方法。单击 Operations 选项卡。为名称参数输入 org.hibernate并单击 addLoggerMBean按钮。您应该会看到一个新的 MBean 出现在左边的树中。
单击新的 org.hibernateMBean 并将优先级属性更改为 DEBUG,如图 9 所示:
图 9. 更改 org.hibernateMBean 上的优先级现在返回到 Web 浏览器,单击主链接,并再次单击 AirportMappingController。应该会看到一大串 DEBUG日志语句,如清单 10 所示:
清单 10. Hibernate log4j 输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[DEBUG] 10:05:52 (AbstractBatcher.java:logOpenPreparedStatement:366)
about to open PreparedStatement (open PreparedStatements: 0, globally: 0)

[DEBUG] 10:05:52 (ConnectionManager.javapenConnection:421)
opening JDBC connection

[DEBUG] 10:05:52 (AbstractBatcher.java:log:401)
select this_.airport_id as airport1_0_0_, this_.locid as locid0_0_,
this_.latitude as latitude0_0_, this_.longitude as longitude0_0_,
this_.airport_name as airport5_0_0_, this_.state as state0_0_
from usgs_airports this_ limit ?

[DEBUG] 10:05:52 (AbstractBatcher.java:logOpenResults:382)
about to open ResultSet (open ResultSets: 0, globally: 0)

[DEBUG] 10:05:52 (Loader.java:getRow:1173)
result row: EntityKey[AirportMapping#1]

[DEBUG] 10:05:52 (Loader.java:getRow:1173)
result row: EntityKey[AirportMapping#2]




花一点时间查看 Hibernate DEBUG输出。您详细了解到何时从数据库挑选数据,并转换为一个由 bean 组成的 ArrayList。
使用 Spring Bean Builder现在您已经知道了如何通过 resources.xml 配置 JMX,因此可以进行新的实践了。Grails 通过一个替代文件 resources.groovy 支持 Spring 配置。将 grails-app/conf/spring/resources.xml 重命名为 resources.xml.old。将如清单 11 所示的代码添加到 resources.groovy 中:
清单 11. 使用 Bean Builder 配置 Spring
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.jmx.support.MBeanServerFactoryBean
import org.springframework.jmx.export.MBeanExporter
import org.apache.log4j.jmx.HierarchyDynamicMBean

beans = {
log4jBean(HierarchyDynamicMBean)
  
mbeanServer(MBeanServerFactoryBean) {
   locateExistingServerIfPossible=true
}
  
exporter(MBeanExporter) {
   server = mbeanServer
    beans = ["log4j:hierarchy=default":log4jBean]
}   
}




如您所见,Spring bean 使用 Groovy 代码(而不是 XML)配置的。您已经在 “” 和 “” 中看到现实中的 Groovy MarkupBuilder。主题有点变化 —一个专门为 Spring 配置定义 bean 的 Bean Builder。
重新启动 Grails 和 JConsole。确认 XML 配置中没有任何更改。
使用 XML 来配置 Spring 可以轻松运用 Web 各种优势 —可以从大量源复制粘贴代码片段。但是使用 Bean Builder 更符合 Grail 中的其余配置。使用 Grails 到现在,您已经看到了 DataSource.groovy、Config.groovy、BootStrap.groovy 和 Events.groovy,这只是其中一小部分。在代码中进行配置,这意味着您可以执行一些操作,比如基于运行的环境有条件地呈现 MBean。
例如,清单 12 显示了如何在生产环境中呈现 log4jBean,但在开发环境中隐藏它:
清单 12. 有条件地呈现 JMX bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.springframework.jmx.support.MBeanServerFactoryBean
import org.springframework.jmx.export.MBeanExporter
import org.apache.log4j.jmx.HierarchyDynamicMBean
import grails.util.GrailsUtil

beans = {
log4jBean(HierarchyDynamicMBean)
  
mbeanServer(MBeanServerFactoryBean) {
   locateExistingServerIfPossible=true
}
  
switch(GrailsUtil.environment){
   case "development":
   break
   
   case "production":
     exporter(MBeanExporter) {
       server = mbeanServer
        beans = ["log4j:hierarchy=default":log4jBean]
     }        
   break
}
}




输入 grails run-app并在 JConsole 中确定 log4j MBean 没有出现在开发模式中。现在输入 grails prod run-app(或 grails war并将 WAR 文件部署到您选择的应用服务器)。这个 MBean 会一直等待您重新启动 JConsole。
返回列表