2015-04-06 115 views
1

我無法連接到JDNI中使用Spring Boot的兩個數據源。Spring Boot,多個DataSources和JNDI連接

下面的堆棧跟蹤產生:

TID: [0] [AS] [2015-04-06 10:53:50,795] ERROR 
{org.apache.tomcat.jdbc.pool.ConnectionPool} - Unable to create 
initial connections of pool. 
{org.apache.tomcat.jdbc.pool.ConnectionPool} java.sql.SQLException: 
The url cannot be null at 
java.sql.DriverManager.getConnection(DriverManager.java:556) at 
java.sql.DriverManager.getConnection(DriverManager.java:187) at 
org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:305) 
    at 
org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:200) 
    at 
org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) 
    at 
org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) 
    at 
org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) 
    at 
org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) 
    at 
org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) 
    at 
org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) 
    at 
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126) 
    at 
org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
    at 
org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
    at 
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:339) 
    at 
org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection.isEmbedded(EmbeddedDatabaseConnection.java:126) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.getDefaultDdlAuto(JpaProperties.java:203) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.getOrDeduceDdlAuto(JpaProperties.java:191) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.getAdditionalProperties(JpaProperties.java:179) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.access$000(JpaProperties.java:130) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.getHibernateProperties(JpaProperties.java:127) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.getVendorProperties(HibernateJpaAutoConfiguration.java:99) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.entityManagerFactory(JpaBaseConfiguration.java:111) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$d2a55c5.CGLIB$entityManagerFactory$5(<generated>) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$d2a55c5$$FastClassBySpringCGLIB$$caf87827.invoke(<generated>) 
    at 
org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at 
org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:309) 
    at 
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration$$EnhancerBySpringCGLIB$$d2a55c5.entityManagerFactory(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606)  at 
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
    at 
org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111) 
    at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006) 
    at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at 
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 
    at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 
    at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at 
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at 
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
    at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at 
org.springframework.boot.context.web.SpringBootServletInitializer.run(SpringBootServletInitializer.java:117) 
    at 
org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:108) 
    at 
org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:68) 
    at 
org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175) 
    at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5274) 
    at 
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
    at 
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
    at 
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) 
    at 
org.wso2.carbon.tomcat.internal.CarbonTomcat.addWebApp(CarbonTomcat.java:280) at 
org.wso2.carbon.tomcat.internal.CarbonTomcat.addWebApp(CarbonTomcat.java:177) at 
org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.handleWebappDeployment(TomcatGenericWebappsDeployer.java:222) 
    at 
org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.handleWarWebappDeployment(TomcatGenericWebappsDeployer.java:174) 
    at 
org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.handleHotDeployment(TomcatGenericWebappsDeployer.java:141) 
    at 
org.wso2.carbon.webapp.mgt.TomcatGenericWebappsDeployer.deploy(TomcatGenericWebappsDeployer.java:116) 
    at 
org.wso2.carbon.webapp.mgt.AbstractWebappDeployer.deployThisWebApp(AbstractWebappDeployer.java:140) 
    at 
org.wso2.carbon.webapp.mgt.AbstractWebappDeployer.deploy(AbstractWebappDeployer.java:90) 
    at 
org.wso2.carbon.webapp.deployer.WebappDeployer.deploy(WebappDeployer.java:42) at 
org.wso2.carbon.webapp.mgt.AbstractWebappDeployer.handleRedeployment(AbstractWebappDeployer.java:410) 
    at 
org.wso2.carbon.webapp.mgt.AbstractWebappDeployer.undeploy(AbstractWebappDeployer.java:188) 
    at 
org.apache.axis2.deployment.DeploymentEngine.unDeploy(DeploymentEngine.java:914) 
    at 
org.apache.axis2.deployment.repository.util.WSInfoList.update(WSInfoList.java:143) 
    at 
org.apache.axis2.deployment.RepositoryListener.update(RepositoryListener.java:377) 
    at 
org.apache.axis2.deployment.RepositoryListener.checkServices(RepositoryListener.java:254) 
    at 
org.apache.axis2.deployment.RepositoryListener.startListener(RepositoryListener.java:371) 
    at 
org.apache.axis2.deployment.scheduler.SchedulerTask.checkRepository(SchedulerTask.java:59) 
    at 
org.apache.axis2.deployment.scheduler.SchedulerTask.run(SchedulerTask.java:67) 
    at 
org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask.runAxisDeployment(CarbonDeploymentSchedulerTask.java:79) 
    at 
org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask.run(CarbonDeploymentSchedulerTask.java:124) 
    at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) 
    at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) 
    at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
    at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

這是我的YAML文件的內容(我已經取代主機,端口,數據庫,服務器,佔位符用戶名和密碼信息):

spring: 
    profiles: 
     active: development 

--- 

spring: 
    profiles: local 

datasource: 
    future: 
     driver-class-name: com.mysql.jdbc.Driver 
     url: jdbc:mysql://<host>:<port>/<database> 
     username: <username> 
     password: <password> 
     jpa: 
      hibernate: 
       ddl-auto: validate 
      database-platform: org.hibernate.dialect.MySQL5Dialect 
      show-sql: true 
    past: 
     driver-class-name: com.informix.jdbc.IfxDriver 
     url: jdbc:informix-sqli://<host>:<port>/<database>:INFORMIXSERVER=<server> 
     jpa: 
      hibernate: 
       ddl-auto: validate 
      database-platform: org.hibernate.dialect.InformixDialect 
      show-sql: true 
jmx: 
    enabled: false 
logging: 
    file: /logs/my.log 
    level: 
     org.springframework: 'OFF' 
--- 

spring: 
    profiles: development 
datasource: 
    future: 
     datasource: 
      jndi-name: java:/comp/env/jdbc/ds1 
      platform: mysql 
     jpa: 
      hibernate: 
       ddl-auto: validate 
      database-platform: org.hibernate.dialect.MySQL5Dialect 
      show-sql: true 
    past: 
     datasource: 
      jndi-name: java:/comp/env/jdbc/ds2 
      platform: informix 
     jpa: 
      hibernate: 
       ddl-auto: validate 
      database-platform: org.hibernate.dialect.InformixDialect 
      show-sql: true 
jmx: 
    enabled: false 
logging: 
    file: /logs/my.log 
    level: 
     org.springframework: 'OFF' 

以下是我的Application.java(應用程序入口點)文件的內容。

package com.mydomain.app.appconfig; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.orm.jpa.EntityScan; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Primary; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 
import org.springframework.boot.context.properties.ConfigurationProperties; 

import javax.sql.DataSource; 

@Configuration 
@EnableAutoConfiguration 
@ComponentScan(basePackages = {"com.mydomain.app"}) 
@EnableJpaRepositories(basePackages = "com.mydomain.app.repository") 
@EntityScan(basePackages = {"com.mydomain.app.entity"}) 
public class Application { 
    @Bean 
    @Primary 
    @ConfigurationProperties(prefix = "datasource.future") 
    public DataSource futureDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    @ConfigurationProperties(prefix = "datasource.past") 
    public DataSource pastDataSource() { 
     return DataSourceBuilder.create().build(); 
    } 

    @Bean 
    public JdbcTemplate futureJdbcTemplate() { 
     return new JdbcTemplate(futureDataSource()); 
    } 

    @Bean 
    public JdbcTemplate pastJdbcTemplate() { 
     return new JdbcTemplate(pastDataSource()); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(StayServiceApplication.class, args); 
    } 
} 

這是我的context.xml文件負責定義JNDI連接的片段。

<Context> 

    <!-- Default set of monitored resources --> 

    <Loader className="org.wso2.carbon.webapp.mgt.loader.CarbonWebappLoader" loaderClass="org.wso2.carbon.webapp.mgt.loader.CarbonWebappClassLoader"/> 

    <!-- Uncomment this to disable session persistence across Tomcat restarts --> 
    <!-- 
    <Manager pathname="" /> 
    --> 

    <!-- Uncomment this to enable Comet connection tacking (provides events 
     on session expiration as well as webapp lifecycle) --> 
    <!-- 
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> 
    --> 

<Resource name="jdbc/stayds" auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver" 
      maxActive="30" maxIdle="10" maxWait="10000" 
      url="jdbc:mysql://<host>:<post>/<database>" 
      username="<username>" password="<password>" /> 

<Resource name="jdbc/gpmds" auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="com.informix.jdbc.IfxDriver" 
      url="jdbc:informix-sqli://<host>:<post>/<database>:INFORMIXSERVER=<server>" 
      maxActive="30" maxIdle="10" maxWait="10000" 
      removeAbandoned="true" removeAbandonedTimeout="60" 
      logAbandoned="true" />  
</Context> 

我在做什麼錯?

回答

0

此應用程序已部署到WSO2應用程序服務器。將JNDI屬性添加到WSO2應用程序控制臺中的JNDI連接配置解決了此問題。