anj*_*anb 5 java oracle spring jdbc spring-data-jdbc
仅使用 jdbc 和 Oracle jdbc 作为依赖项创建了一个全新的启动项目
Run Code Online (Sandbox Code Playgroud)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc8</artifactId> <version>12.2.0.1</version> </dependency>
我在 application.properties 文件中配置数据源并运行这个简单的应用程序,它会使用以下堆栈跟踪进行轰炸。
2020-05-25 15:07:16.769 WARN 11840 --- [main] scaAnnotationConfigApplicationContext:上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“jdbcConverter”的 bean 时出错类路径资源[org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]:通过方法'jdbcConverter'参数4表示的不满足的依赖;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class] 中定义的名称为“jdbcDialect”的 bean 创建时出错:通过工厂方法的 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.relational.core.dialect.Dialect]:工厂方法“jdbcDialect”抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException:无法确定 org.springframework.jdbc.core.JdbcTemplate@7fe083b1 的方言。请提供方言。2020-05-25 15:07:16.769 INFO 11840 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 关闭启动...... 2020-05-25 15:07:17.023 INFO 11 [主要] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 关闭完成。2020-05-25 15:07:17。
启动 ApplicationContext 时出错。要显示条件报告,请在启用“调试”的情况下重新运行您的应用程序。2020-05-25 15:07:17.035 错误 11840 --- [main] osboot.SpringApplication
:应用程序运行失败org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“jdbcConverter”的 bean 在类路径资源 [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class] 中定义时出错:通过方法“jdbcConverter”表达的不满意依赖' 参数 4; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class] 中定义的名称为“jdbcDialect”的 bean 创建时出错:通过工厂进行 Bean 实例化方法失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.relational.core.dialect。方言]:工厂方法'jdbcDialect'抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException:无法确定 org.springframework.jdbc.core.JdbcTemplate@7fe083b1 的方言。请提供方言。在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory。 support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:539) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingAutowireCapBeanFactoryMethod(AbstractAutowireCapableBeanFactory. :1338) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org. 1226) [spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] 在 net.sincera.dbmigration.liquibasedemo.LiquibasedemoApplication.main(LiquibasedemoApplication.java:21) [classes/:na] 引起:org .springframework.beans.factory.BeanCreationException:在类路径资源[org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]中定义名为“jdbcDialect”的bean创建错误:通过工厂方法的Bean实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.relational.core.dialect.Dialect]:工厂方法“jdbcDialect”抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException:无法确定 org.springframework.jdbc.core.JdbcTemplate@7fe083b1 的方言。请提供方言。在 org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory。 support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingAutowireCapBeanFactoryMethod(AbstractAutowireCapableBeanFactory. :1338) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans- 5.2.6.RELEASE.jar:5.2.6。java:885) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ~[spring-beans -5.2.6.RELEASE.jar:5.2.6.RELEASE] ... 19 个常见框架被省略导致:org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.data.relational.core.dialect.Dialect ]:工厂方法'jdbcDialect'抛出异常;嵌套异常是 org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException:无法确定 org.springframework.jdbc.core.JdbcTemplate@7fe083b1 的方言。请提供方言。在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6。RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE] ...省略了33个常用框架引起:org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException:无法确定 org.springframework.jdbc.core.JdbcTemplate@7fe083b1 的方言。请提供方言。在 org.springframework.data.jdbc.repository.config.DialectResolver.lambda$getDialect$2(DialectResolver.java:76) ~[spring-data-jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE] 在 java .util.Optional.orElseThrow(Optional.java:290) ~[na:1.8.0_241] 在 org.springframework.data.jdbc.repository.config.DialectResolver.getDialect(DialectResolver.java:75) ~[spring-data- jdbc-2.0.0.RELEASE.jar:2.0.0.RELEASE] 在 org.springframework.data.jdbc。
如果我使用 spring boot 2.2.7.RELEASE 运行上面的代码,它工作得很好——没有例外!!
2天后,我想到在localhost上配置一个mysql数据源。相同的程序运行得很好(使用 spring boot 2.3.0.RELEASE),但这次它使用了 mysql 数据源。
Run Code Online (Sandbox Code Playgroud)<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
spring boot 2.3.0.RELEASE 中的 oracle jdbc 驱动程序发生了什么?
mysql jdbc 驱动程序在 spring boot 2.3.0.RELEASE 中正确做什么?
谢谢你。
Jen*_*der 12
spring boot 2.3.0.RELEASE 中的 oracle jdbc 驱动程序发生了什么?
JDBC 驱动程序运行良好。
正如您在评论中已经了解到的,问题是
a) Spring Data JDBC 现在要求Dialect每个数据库都有一个
b) Spring Data JDBC 不附带Dialectfor Oracle。
如Spring Data JDBC Firebird 方言中所述,在https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0 中,
您需要立即提供您自己的Dialect实现.
这样的事情应该工作:
class MyOracleDialect extends AnsiDialect {
private static final LimitClause LIMIT_CLAUSE = new LimitClause() {
@Override
public String getLimit(long limit) {
return String.format("FETCH NEXT %d ROWS ONLY", limit);
}
@Override
public String getOffset(long offset) {
return String.format("OFFSET %d ROWS", offset);
}
@Override
public String getLimitOffset(long limit, long offset) {
return String.format("OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", offset, limit);
}
@Override
public Position getClausePosition() {
return Position.AFTER_ORDER_BY;
}
};
@Override
public LimitClause limit() {
return LIMIT_CLAUSE;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您需要按照引用的 Stackoverflow 问题中的说明Dialect通过 a 提供可用DialectProvider:
到目前为止,Spring Data 团队还没有使用 Oracle 数据库运行他们的集成测试。这是因为在相当长的一段时间内,由于包括构建基础设施在内的所有代码都是开源的,并且 Oracle 需要接受各种东西才能使用数据库实例或其驱动程序,因此很长一段时间都不清楚如何以合法的方式做到这一点。
到目前为止,Docker 镜像可用于测试,JDBC 驱动程序可从 Maven Central 获得。这仍然有点棘手,因为我所知道的 docker 图像的当前选项允许您在许多 GB 的图像大小或大约 15 分钟的启动时间之间进行选择。
无论如何,有一个社区成员正在解决这个问题:https : //jira.spring.io/browse/DATAJDBC-256
因此,我相信我们将能够在不久的将来全面支持 Oracle。
这个方言解析器解决了我与 Oracle 的问题。
@Configuration
public class SpringDataJdbcConfiguration extends AbstractJdbcConfiguration {
@Override
public Dialect jdbcDialect(NamedParameterJdbcOperations operations) {
return AnsiDialect.INSTANCE;
}
}
Run Code Online (Sandbox Code Playgroud)