Spring Boot中使用Atomikos指定Oracle数据库Schema的问题
Oracle多Schema数据库连接问题解决
问题描述
项目中配置多连接数据库,采用OracleDB搭建本地数据库,存在多个Schema,无法连接到目标Schema。尝试在JDBC URL中添加currentSchema=mySchema未生效。
当前配置
jdbc.properties
extr.datasource.xa-data-source-class-name=oracle.jdbc.xa.client.OracleXADataSource extr.datasource.xa-properties.user=system extr.datasource.xa-properties.password=123456 extr.datasource.xa-properties.URL=jdbc:oracle:thin:@localhost:1521/XEPDB1
数据库配置类
@Configuration public class ExtrPersistenceConfig { /** * 配置JDBC属性 * @return */ @Bean(name = "extrDS") @ConfigurationProperties(prefix = "extr.datasource") public DataSource datasource() { return new AtomikosDataSourceBean(); } /** * 设置EntityManagerFactory以创建EntityManager * * @param ds * @return */ @Bean(name = "extrEM") public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("extrDS") DataSource ds) { return AtomikosTxConfiguration.setEntityManagerFactoryBean(ds, "extrPU", new HibernateJpaVendorAdapter(), "com.cbm.batch.ccris.vo"); } /** * 通过注入cbm-core-atomikos依赖中的atomikosUT和atomikosTM来配置事务管理器 * @param userTransaction * @param transactionManager * @return * @throws Throwable */ @Bean(name = "extrTM") public PlatformTransactionManager transactionManager( @Qualifier("atomikosUT") UserTransaction userTransaction, @Qualifier("atomikosTM") TransactionManager transactionManager) throws Throwable { return new JtaTransactionManager(userTransaction, transactionManager); } }
解决方法
方法1:在XA属性中直接指定currentSchema
对于Oracle XA数据源,可直接在xa-properties中添加currentSchema配置,修改jdbc.properties:
extr.datasource.xa-properties.currentSchema=mySchema
方法2:通过Hibernate配置指定默认Schema
利用Hibernate的hibernate.default_schema属性指定默认Schema,修改entityManagerFactory方法:
@Bean(name = "extrEM") public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("extrDS") DataSource ds) { LocalContainerEntityManagerFactoryBean em = AtomikosTxConfiguration.setEntityManagerFactoryBean(ds, "extrPU", new HibernateJpaVendorAdapter(), "com.cbm.batch.ccris.vo"); Properties jpaProps = new Properties(); jpaProps.put("hibernate.default_schema", "mySchema"); em.setJpaProperties(jpaProps); return em; }
方法3:使用目标Schema对应的用户登录
如果无需使用system用户,直接使用目标Schema所属的用户账号登录,连接后默认会指向该Schema:
extr.datasource.xa-properties.user=mySchema专属用户名 extr.datasource.xa-properties.password=对应密码
方法4:配置连接初始化SQL
每次建立连接时执行切换Schema的语句,可通过Atomikos数据源的init-sql参数配置:
修改jdbc.properties
extr.datasource.init-sql=ALTER SESSION SET CURRENT_SCHEMA = mySchema
或手动配置数据源Bean
@Bean(name = "extrDS") @ConfigurationProperties(prefix = "extr.datasource") public DataSource datasource() { AtomikosDataSourceBean ds = new AtomikosDataSourceBean(); ds.setInitSql("ALTER SESSION SET CURRENT_SCHEMA = mySchema"); return ds; }
内容的提问来源于stack exchange,提问作者Atlas Wong
相关产品推荐
相关产品推荐

