Я пытаюсь изучить различные способы создания источника данных. В этом примере https://github.com/ivoronline/springboot_db_datasource_create_DataSourceBuilder Я использовал DriverManagerDataSource.class для успешного создания источника данных, как показано ниже.
application.properties
# ORACLE DB
my.spring.datasource.url = jdbc:oracle:thin:@localhost:1522/orcl
my.spring.datasource.username = TEST
my.spring.datasource.password = LETMEIN
Моя база данныхконфиг
@Configuration
public class MyDatabaseConfig {
//=========================================================================================================
// DATA SOURCE
//=========================================================================================================
@Bean
@ConfigurationProperties("my.spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().type(DriverManagerDataSource.class).build();
}
}
Но когда я пытаюсь заменить DriverManagerDataSource.class на HikariDataSource.class, я получаю ошибку. Я в замешательстве, потому что в другом https://github.com/ivoronline/springboot_db_datasource_SaveSameEntityToDifferetnSchema более сложном проекте это работало.
Ошибка
Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)
Также правильно ли я понял, что DriverManagerDataSource не использует пул соединений и что Spring Boot по умолчанию использует HikariDataSource с пулом соединений за ним? Таким образом, этот подход будет вручную делать то, что Spring Boot делает автоматически?
Невозможно определить диалект без метаданных JDBC (пожалуйста, установите «jakarta.persistence.jdbc.url» для распространенных случаев или «hibernate.dialect», если необходимо предоставить собственную реализацию диалекта). Я думаю, что это больше похоже на общую ошибку, когда источник данных не был создан.
Пожалуйста, добавьте это в свой вопрос вместо комментариев.




Вы правы, Spring Boot сначала автоматически выберет HikariDataSource (https://docs.spring.io/spring-boot/reference/data/sql.html#data.sql.datasource.connection-pool), но он должен быть зависимостью вашего проекта. Обычно вы можете автоматически подключить Хикари, включив зависимость spring-boot-starter-jdbc. При этом вы можете изменить свой код следующим образом:
@Bean
@ConfigurationProperties("my.spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
Предоставленные вами ссылки мне не помогли, поэтому я не могу просмотреть ваш конкретный проект, но я предполагаю, что вам не хватает зависимости.
Спасибо, что сообщили мне, что мои репозитории являются частными. Я исправил это сейчас. Эта линия не сработала. Я получаю ту же ошибку. У меня был «spring-boot-starter-data-jpa». Это не работает, даже когда я добавляю «spring-boot-starter-jdbc».
Способ создания источника данных немного неправильный. Сначала вам следует создать bean-компонент для типа DataSourceProperties и использовать его для привязки свойств для my.spring.datasource.
Затем используйте этот компонент для создания DataSource.
@Bean
@ConfigurationProperties("my.spring.datasource")
public DataSourceProperties myDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("my.spring.datasource.hikari")
public DataSource myDataSource(DataSourceProperties myDataSourceProperties) {
return myDataSourceProperties.initializeDataSourceBuilder().build();
}
В чем разница, наверное, спросите вы.
Ваше решение свяжет свойства с результирующим DataSource, что довольно зависит от поставщика в отношении того, как создавать свойства. В то время как это решение использует более распространенные имена и имеет некоторую логику для адаптации к хорошо известному решению пула соединений (например, Hikari, Tomcat, Commons DBCP и т. д.). Затем конкретный my.spring.datasource.hikari привязывается к результирующему источнику данных и содержит свойства, специфичные для поставщика.
Хорошо, если я просто использую my.spring.datasource.url внутри application.properties и разрешаю Spring Boot все делать самостоятельно, это будет работать, и будет использоваться HikariCP. И если я использую DataSourceProperties, это тоже будет работать. Потому что в этих двух апрачах происходит какая-то дополнительная магия, которая сопоставляет URL-адрес с реальным jdbc-ur. Потому что эти два подхода не настолько специфичны для реализации.
И ошибка, которую вы получаете?