SpringBoot整合JPA通过WebLogic JNDI连接双数据库时出现500内部服务器错误求助
Spring Boot + WebLogic: 部署后所有接口返回500,Hibernate无法获取JNDI数据源连接
大家好,这个问题已经卡了我3天了,实在没办法来求助。我的Spring Boot应用用Maven构建完全没问题,但部署到WebLogic服务器之后,调用任何接口都返回500内部服务器错误。查看日志后发现核心问题是Hibernate无法获取JNDI数据源的连接,报错找不到合适的驱动。
错误日志片段
2021-10-29 17:23:47.788 INFO 64993 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.32.Final 2021-10-29 17:23:48.021 INFO 64993 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2021-10-29 17:23:48.269 WARN 64993 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata java.sql.SQLException: No suitable driver found for jdbc/facturador ...(省略重复栈追踪) 2021-10-29 17:23:48.507 WARN 64993 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata java.sql.SQLException: No suitable driver found for jdbc/differenceload ...(省略重复栈追踪)
我的配置代码
数据源配置类 DataSourceConfig
import javax.sql.DataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource",destroyMethod = "") @Primary @ConfigurationProperties("spring.datasource.primary") public DataSource firstDataSource(){ return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource",destroyMethod = "") @ConfigurationProperties("spring.datasource.secondary") public DataSource secondDataSource(){ return DataSourceBuilder.create().build(); } }
本地数据库持久化配置类 PersistenceLocalConfig
import java.util.HashMap; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; @Configuration @PropertySource("classpath:/application.properties") @EnableJpaRepositories(basePackages = "com.gt.tigo.diferenceLoad.entities.facturador", entityManagerFactoryRef = "localEntityManager", transactionManagerRef = "localTransactionManager") public class PersistenceLocalConfig { @Autowired private Environment env; @Bean @Primary public LocalContainerEntityManagerFactoryBean localEntityManager() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(localDataSource()); em.setPackagesToScan(new String[] { "com.gt.tigo.diferenceLoad.entities.local" }); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); HashMap<String, Object> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); properties.put("hibernate.dialect", env.getProperty("hibernate.dialect")); em.setJpaPropertyMap(properties); return em; } @Primary @Bean public DataSource localDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setUrl(env.getProperty("spring.datasource.primary.jndi-name")); return dataSource; } @Primary @Bean public PlatformTransactionManager localTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(localEntityManager().getObject()); return transactionManager; } }
Facturador数据库持久化配置类 PersistenceFacturadorConfig
import java.util.HashMap; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; @Configuration @PropertySource("classpath:/application.properties") @EnableJpaRepositories(basePackages = "com.gt.tigo.diferenceLoad.entities.facturador", entityManagerFactoryRef = "FacturadorEntityManager", transactionManagerRef = "facturadorTransactionManager") public class PersistenceFacturadorConfig { @Autowired private Environment env; @Bean public LocalContainerEntityManagerFactoryBean FacturadorEntityManager() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(facturadorDataSource()); em.setPackagesToScan(new String[] { "com.gt.tigo.diferenceLoad.entities.facturador" }); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); HashMap<String, Object> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); properties.put("hibernate.dialect", env.getProperty("hibernate.dialect")); em.setJpaPropertyMap(properties); return em; } @Bean public DataSource facturadorDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setUrl(env.getProperty("spring.datasource.secondary.jndi-name")); return dataSource; } @Bean public PlatformTransactionManager facturadorTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(FacturadorEntityManager().getObject()); return transactionManager; } }
application.properties 配置
#Base de datos LOCAL spring.datasource.primary.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.primary.jndi-name=jdbc/differenceload #Base de datos FACTURADOR spring.datasource.secondary.jndi-name=jdbc/facturador spring.datasource.secondary.driver-class-name=oracle.jdbc.OracleDriver
额外说明
我已经在WebLogic服务器上配置了对应的JNDI数据源,并且测试连接是正常的。也试过检查依赖是否包含Oracle驱动、确认JNDI名称完全匹配等常规方法,但都没解决问题。
有没有大佬能帮我看看哪里出问题了?万分感谢!
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

