数据源在 WebLogic 12.2 上无故丢失

datasource get lost on WebLogic 12.2 without any reason

我们想在 WebLogic 12.2.1.3 上部署一个基于 Spring 的应用程序。它使用 JDBC 数据源和 jdbc/payeshws 数据源。

当我部署应用程序(使用控制台或自动部署文件夹)并启动应用程序时,一切正常,但如果我停止然后在 WebLogic 控制台中启动应用程序,它会引发异常,其根本原因为:

Caused by: javax.naming.NameNotFoundException: Unable to resolve 'jdbc.payeshws'. Resolved 'jdbc'
    at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1292)
    at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:354)
    at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:227)
    at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:214)
    at weblogic.jndi.internal.ServerNamingNode.lookup(ServerNamingNode.java:527)
    at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:228)
    at weblogic.jndi.internal.ServerNamingNode.lookup(ServerNamingNode.java:527)
    at weblogic.jndi.internal.RootNamingNode.lookup(RootNamingNode.java:84)
    at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:307)
    at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:435)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at org.springframework.jndi.JndiTemplate.lambda$lookup[=10=](JndiTemplate.java:156)
    at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:91)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:156)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:105)
    at org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup.getDataSource(JndiDataSourceLookup.java:45)

如果我启动,再次停止 WebLogic,它再次正常。

我什至尝试重新启动数据源(通过在 AdminServer 上启用和禁用它),但问题仍然存在。

我们的应用程序在 WebLogic 12.1 + Java 7 上运行没有任何问题。

P.S。我不确定它是否有帮助,但该应用程序使用 MyBatis 进行数据访问。

我找到了答案here。我相信这是 Spring 5.1.x 的错误,因为使用 Spring 4.2.x.

没有这样的问题

我应该将 destroyMethod="" 添加到数据源定义 bean,因为

@Bean(destroyMethod = "")
public DataSource jndiDataSource() {
    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    return lookup.getDataSource(datasourceJndi);
}