HikariCP Pool使Logback的insertFromJNDI配置停止工作

时间:2017-04-19 16:52:46

标签: logback hikaricp

我有两个共享commons.jar库的Spring MVC应用程序。该库包括logb​​ack日志库(logback 1.2.3和slf4j 1.7.25)和logback.xml文件。

这两场战争都在他们的web.xml文件中包含这一行:

shinyApp(
  ui = fluidPage(
    fluidRow(
      column(12,
             dataTableOutput('table')
      )
    )
  ),
  server = function(input, output) {
    output$table <- renderDataTable(iris,
                                    rownames=FALSE,
                                    extensions = c("FixedColumns", "FixedHeader", "Scroller"), 
                                    options = list(searching=TRUE,
                                                   # autoWidth=TRUE,
                                                   scroller=TRUE,
                                                   scrollX=TRUE,
                                                   scrollY=paste0(4*nrow(iris),"px"),
                                                   fixedHeader=TRUE,
                                                   class='cell-border stripe',
                                                   fixedColumns=list(leftColumns=2,heightMatch='none')
                                    )
    )
  }
)

每个应用程序都会生成自己的日志文件,包括主机名,例如: HOST1-nameOfApplicationA.log 。 Logback配置如下:

<env-entry>
    <env-entry-name>applicationName</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>nameOfApplicationA|nameOfApplicationB</env-entry-value>
</env-entry>

一切正常(Spring MVC 4.3.7.RELEASE,Hibernate 4,C3P0最新),但我们决定升级到Hibernate 5.2.10并更改为HikariCP 2.6.1。之后,logback不再能够解析 java:comp / env / applicationName

<insertFromJNDI env-entry-name="java:comp/env/applicationName" as="APP_NAME" />
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/${HOSTNAME}-${APP_NAME}.log</file>
 ...
 </appender>

导致两个应用程序使用相同的文件名 HOST1-APP_NAME_IS_UNDEFINED.log

当我们同时改变Hibernate和HikariCP时,我们回到C3P0来检查根本原因,并且可以确认新版本的Hibernate无关。这个变化是在它自己的分支中发展的,所以没有其他变化似乎会影响(无论如何,当它返回到C3P0时它起作用)。

我一直在Hikari和Logback的代码中进行一些跟踪,但我无法看到任何内容。我被困住了,不知道该看什么。

计划B在每个战争中插入自己的 logback.xml ,但我想避免它并理解问题,因为它可能会影响应用程序的其他部分。

两个战争都在Apache Tomcat / 8.0.38服务器中一起部署。也试过8.5.12。如果只有一次战争单独部署,也会发生这种情况。

1 个答案:

答案 0 :(得分:0)

虽然我没有找到解决方案,但@ brettw发现了问题(请参阅https://github.com/brettwooldridge/HikariCP/issues/873),并得到了解决方法。

似乎因为HikariCP依赖于slf4j,并且HikariCP也被初始化并注册到JNDI中,导致Logback在{{1}之前初始化条目已注册。

所做的测试是使用<env-entry>工厂而不是"org.apache.naming.factory.BeanFactory"将Hikari数据源初始化。这样它就可以正常工作。