[java.sql.SQLSyntaxErrorException异常:尝试对Oracle DB进行查询时,模式'SA'不存在

问题描述 投票:0回答:1

我已经犯了几个星期的错误,我想知道周围的人是否可以阐明一些想法...我有一个Web应用程序,我使用Spring Boot构建了该应用程序,它连接到两个数据库,两个数据库均为Oracle。在我的开发环境中,我在Spring Boot嵌入式tomcat中进行部署,并且一切正常。当我在Weblogic(集成环境)中部署时会出现问题,该WebLogic尝试登录时在尝试执行select

时返回以下异常
<Dec 27, 2019 1:58:16,335 PM CET> <Warning> <org.hibernate.engine.jdbc.spi.SqlExceptionHelper> <BEA-000000> <SQL Error: 30000, SQLState: 42Y07>
<Dec 27, 2019 1:58:16,336 PM CET> <Error> <org.hibernate.engine.jdbc.spi.SqlExceptionHelper> <BEA-000000> <Schema 'SA' does not exist>
<Dec 27, 2019 1:58:16,343 PM CET> <Error> <org.springframework.boot.web.servlet.support.ErrorPageFilter> <BEA-000000> <Forwarding to error page from request [/login_ldap] due to exception [could not prepare statement; SQL [select userentity0_.id as id1_6_, userentity0_.name as name2_6_, userentity0_.operator as operator3_6_, userentity0_.profile as profile4_6_, userentity0_.roles as roles5_6_, userentity0_.theme as theme6_6_, userentity0_.token as token7_6_ from USERS userentity0_ where userentity0_.name=?]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement]
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [select userentity0_.id as id1_6_, userentity0_.name as name2_6_, userentity0_.operator as operator3_6_, userentity0_.profile as profile4_6_, userentity0_.roles as roles5_6_, userentity0_.theme as theme6_6_, userentity0_.token as token7_6_ from USERS userentity0_ where userentity0_.name=?]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:240)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:223)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    ....
    ....
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:415)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:355)
Caused By: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:181)
    ....
    ....
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:415)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:355)
Caused By: java.sql.SQLSyntaxErrorException: Schema 'SA' does not exist
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    ....
    ....
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:415)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:355)
Caused By: ERROR 42Y07: Schema 'SA' does not exist
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getSchemaDescriptor(Unknown Source)
    at org.apache.derby.iapi.sql.StatementUtil.getSchemaDescriptor(Unknown Source)
    ....
    ....
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:415)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:355)
>

我已经访问了很多论坛,他们都提到使用Derby DB时可能发生的错误,实际上,在跟踪异常的情况下,我可以看到org.apache.derby.iapi.error.StandardException(我不明白为什么)。当我添加第二个数据源时,问题就出现了,因为默认情况下Spring Boot带来的配置对我来说不好,因此,我不得不“手动”配置它。也许,我有一些错误的配置,但是找不到。我的[[application.properties是:

spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc:oracle:thin:@//IP1:PUERTO1/SERVICIO1 spring.datasource.jdbc-url=jdbc:oracle:thin:@//IP1:PUERTO1/SERVICIO1 spring.datasource.username=USERNAME1 spring.datasource.password=PASSWORD1 spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.hikari.connection-init-sql=ALTER SESSION SET CURRENT_SCHEMA=USERNAME1 spring.remd-datasource.driver-class-name=oracle.jdbc.OracleDriver spring.remd-datasource.url=jdbc:oracle:thin:@//IP2:PUERTO2/SERVICIO2 spring.remd-datasource.jdbc-url=jdbc:oracle:thin:@//IP2:PUERTO2/SERVICIO2 spring.remd-datasource.username=USERNAME2 spring.remd-datasource.password=PASSWORD2 spring.remd-datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver spring.remd-datasource.hikari.connection-init-sql=ALTER SESSION SET CURRENT_SCHEMA=USERNAME2 spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect logging.level.org.springframework.web=ERROR logging.level.org.springframework.security.access.intercept=debug logging.level.org.springframework.security=ERROR logging.level.com.hpe=DEBUG logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n logging.file=./logs/serverApplication.log server.error.whitelabel.enabled=false
还有我为这两个数据源创建的配置类:

@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactory", basePackages = { "com.project.repository.clar" } ) public class ClarDataSourceConfiguration { @ConfigurationProperties(prefix = "spring.datasource") @Primary @Bean(name = "dataSource") public DataSource dataSource(DataSourceProperties properties) { return DataSourceBuilder.create(properties.getClassLoader()) .type(HikariDataSource.class) .driverClassName(properties.determineDriverClassName()) .url(properties.determineUrl()) .username(properties.determineUsername()) .password(properties.determinePassword()) .build(); } @Primary @Bean(name = "entityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) { return builder.dataSource(dataSource).packages("com.project.model.clar").persistenceUnit("clar").build(); } @Primary @Bean(name = "transactionManager") public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } }

@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "remdEntityManagerFactory", transactionManagerRef = "remdTransactionManager", basePackages = { "com.project.repository.remd" } ) public class RemdDataSourceConfiguration { @ConfigurationProperties(prefix = "spring.remd-datasource") @Bean(name = "remdDataSource") public DataSource dataSource(DataSourceProperties properties) { return DataSourceBuilder.create(properties.getClassLoader()) .type(HikariDataSource.class) .driverClassName(properties.determineDriverClassName()) .url(properties.determineUrl()) .username(properties.determineUsername()) .password(properties.determinePassword()) .build(); } @Bean(name = "remdEntityManagerFactory") public LocalContainerEntityManagerFactoryBean remdEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("remdDataSource") DataSource remdDataSource) { return builder.dataSource(remdDataSource).packages("com.project.model.remd").persistenceUnit("remd").build(); } @Bean(name = "remdTransactionManager") public PlatformTransactionManager remdTransactionManager(@Qualifier("remdEntityManagerFactory") EntityManagerFactory remdEntityManagerFactory) { return new JpaTransactionManager(remdEntityManagerFactory); } }

感谢大家提前致以问候!
java database spring-boot oracle11g weblogic12c
1个回答
0
投票
我知道这可能无法回答您的问题,但不久前我遇到了相同的问题(定义多个数据源);这是我的解决方案:

@Configuration @EnableTransactionManagement class PersistenceConfig { @Bean(name = "oneDS") @ConfigurationProperties(prefix = "custom-namespace.datasource.one") public DataSource oneDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "mainDS") @ConfigurationProperties(prefix = "custom-namespace.datasource.main") public DataSource mainDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "twoDS") @ConfigurationProperties(prefix = "custom-namespace.datasource.two") public DataSource twoDataSource() { return DataSourceBuilder.create().build(); } @Bean public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(mainDataSource()); } // ...other beans using the other datasources }

...这是这些设置的application.yml外观:

注意application.yml中没有数据源的内置配置。

custom-namespace: datasource: one: driver-class-name: oracle.jdbc.OracleDriver jdbc-url: jdbc:oracle:thin:/@oneDS main: driver-class-name: oracle.jdbc.OracleDriver jdbc-url: jdbc:oracle:thin:/@mainDS two: driver-class-name: oracle.jdbc.OracleDriver jdbc-url: jdbc:oracle:thin:/@twoDS server: compression: enabled: true port: "${SERVER_PORT:8080}" ssl: enabled: true spring: application: name: "spring-core" banner: charset: UTF-8 http: encoding: charset: UTF-8 enabled: true force: true main: banner-mode: "off" output: ansi: enabled: detect profiles: active: default --- spring: profiles: development --- spring: profiles: production --- server: ssl: enabled: false spring: main: banner-mode: console profiles: sandbox --- spring: profiles: test

由于我使用的是Spring配置文件,因此必须将其“激活”;例如:--spring.profiles.active=sandbox
© www.soinside.com 2019 - 2024. All rights reserved.