Spring Boot多数据库(AWS Elastic Beanstalk)部署后第二个RDS库无法访问
我已将Spring Boot应用部署至AWS Elastic Beanstalk环境,使用两个AWS RDS数据库schema。本地环境中两个数据库均可正常工作,但部署到Elastic Beanstalk后,仅标记为Primary的crosscheckdbxr数据库可用,无法从第二个sectiondbxr数据库中获取数据。请检查以下配置并给出建议:
application.properties配置
spring.jpa.properties.hibernate.jdbc.time_zone=UTC spring.jpa.generate-ddl=true spring.db1.datasource.jdbc-url=jdbc:mysql://devdbxr.cnk8oyka2f9o.eu-central-1.rds.amazonaws.com:3306/crosscheckdbxr spring.db1.datasource.username=admin spring.db1.datasource.password= spring.db1.datasource.member.driverClassName=com.mysql.cj.jdbc.Driver spring.db2.datasource.jdbc-url=jdbc:mysql://devdbxr.cnk8oyka2f9o.eu-central-1.rds.amazonaws.com:3306/sectiondbxr spring.db2.datasource.username=admin spring.db2.datasource.password= spring.db2.datasource.member.driverClassName=com.mysql.cj.jdbc.Driver
crosscheckdbxr数据库配置
@Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "userentityManagerFactory", transactionManagerRef= "usertransactionManager", basePackages = {"com.xr.crosscheck.repository.user"}) public class UserConfig { @Primary @Bean(name = "datasource") @ConfigurationProperties(prefix = "spring.db1.datasource") public DataSource dataSource(){ return DataSourceBuilder.create().build(); } @Primary @Bean(name = "userentityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("datasource") DataSource dataSource){ HashMap<String,Object> properties = new HashMap<>(); properties.put("spring.jpa.hibernate.ddl-auto", "update"); properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); return builder.dataSource(dataSource) .properties(properties) .packages("com.xr.crosscheck.model") .persistenceUnit("db1") .build(); } @Primary @Bean(name = "usertransactionManager") public PlatformTransactionManager transactionManager(@Qualifier("userentityManagerFactory")EntityManagerFactory entityManagerFactory){ return new JpaTransactionManager(entityManagerFactory); } }
sectiondbxr数据库配置
@Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "sectionEntityManagerFactory", transactionManagerRef= "sectionTransactionManager", basePackages = {"com.xr.crosscheck.repository.section"}) public class SteelSectionConfig { @Bean(name = "sectionDataSource") @ConfigurationProperties(prefix = "spring.db2.datasource") public DataSource dataSource(){ return DataSourceBuilder.create().build(); } @Bean(name = "sectionEntityManagerFactory") public LocalContainerEntityManagerFactoryBean SectionEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("sectionDataSource") DataSource dataSource){ HashMap<String,Object> properties = new HashMap<>(); properties.put("spring.jpa.hibernate.ddl-auto", "validate"); properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); return builder.dataSource(dataSource) .properties(properties) .packages("com.xr.crosscheck.model") .persistenceUnit("db2") .build(); } @Bean(name = "sectionTransactionManager") public PlatformTransactionManager SteelTransactionManager(@Qualifier("sectionEntityManagerFactory")EntityManagerFactory SectionEntityManagerFactory){ return new JpaTransactionManager(SectionEntityManagerFactory); } }
示例Repository
@Repository public interface CSectionsRepository extends JpaRepository<CSections, Long> { @Query(value = "SELECT SECTION from sectiondbxr.C", nativeQuery = true) List<String> getAllColumn(); @Query(value = "SELECT * from sectiondbxr.C u where u.section = ?1", nativeQuery = true) CSections findBySection(String sectionN); }
修正配置属性前缀错误
application.properties中spring.db1.datasource.member.driverClassName和spring.db2.datasource.member.driverClassName多了member.前缀,正确的键应该是spring.db1.datasource.driverClassName和spring.db2.datasource.driverClassName。这个错误会导致数据库驱动类无法被正确加载,进而无法建立sectiondbxr的连接。验证RDS安全组规则
检查AWS RDS实例的安全组,确保Elastic Beanstalk环境对应的EC2安全组被允许访问RDS的3306端口。本地能连接是因为本地IP在RDS安全组白名单中,但Beanstalk的EC2实例IP可能未被授权,导致sectiondbxr连接失败。分离实体类扫描范围
当前两个EntityManagerFactory都扫描com.xr.crosscheck.model包,可能导致实体类归属冲突。建议将两个数据库的实体类拆分到不同子包(如com.xr.crosscheck.model.user和com.xr.crosscheck.model.section),然后在对应的entityManagerFactory中分别指定packages路径,避免Primary工厂干扰第二个数据库的实体映射。确认数据库密码配置
application.properties中db1和db2的password为空,需确认RDS的admin用户确实无密码,或者在Elastic Beanstalk环境变量中配置了密码但未正确映射到应用配置。本地可能使用了本地配置的密码,部署后未同步导致认证失败。查看Beanstalk应用日志
登录Elastic Beanstalk控制台,下载并查看应用日志,重点排查数据库连接相关的错误(如连接超时、认证失败、驱动加载异常),这些日志能直接定位问题根源。优化Native Query写法
Repository中的Native Query硬编码了数据库名sectiondbxr.C,如果当前连接的数据源已经指向sectiondbxr,可简化为C,避免环境切换时的配置问题。
内容的提问来源于stack exchange,提问作者SERKAN AYDOGDU

