Avec Spring Boot, je peux instancier une JdbcTemplate
avec les éléments suivants:
Code:
@Autowired
private JdbcTemplate jdbcTemplate;
Propriétés:
spring.datasource.url=jdbc:postgresql://my_url:my_port/my_other_stuff
spring.datasource.username=my_user_name
spring.datasource.password=my_password
spring.datasource.driver-class-name=org.postgresql.Driver
Cela crée une source de données de classe: org.Apache.Tomcat.jdbc.pool.DataSource
Comment définir le nom d'utilisateur/mot de passe DataSource par programme?
Nous avons pour politique de ne pas stocker les informations d'identification en texte brut et je dois utiliser un fournisseur d'informations d'identification spécifique sur lequel je travaille.
Vous pouvez utiliser DataSourceBuilder
si vous utilisez jdbc
starter. De plus, pour remplacer le bean d'autoconfiguration par défaut, vous devez marquer votre bean en tant que @Primary
.
Dans mon cas, j'ai des propriétés commençant par datasource.postgres
préfixe.
Par exemple
@ConfigurationProperties(prefix = "datasource.postgres")
@Bean
@Primary
public DataSource dataSource() {
return DataSourceBuilder
.create()
.build();
}
Si ce n'est pas faisable pour vous, alors vous pouvez utiliser
@Bean
@Primary
public DataSource dataSource() {
return DataSourceBuilder
.create()
.username("")
.password("")
.url("")
.driverClassName("")
.build();
}
Mon projet de spring-boot a fonctionné normalement en fonction de votre aide. La configuration de la source de données yaml est la suivante:
spring:
# (DataSourceAutoConfiguration & DataSourceProperties)
datasource:
name: ds-h2
url: jdbc:h2:D:/work/workspace/fdata;DATABASE_TO_UPPER=false
username: h2
password: h2
driver-class: org.h2.Driver
source de données personnalisée
@Configuration
@Component
public class DataSourceBean {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
@Primary
public DataSource getDataSource() {
return DataSourceBuilder
.create()
// .url("jdbc:h2:D:/work/workspace/fork/gs-serving-web-content/initial/data/fdata;DATABASE_TO_UPPER=false")
// .username("h2")
// .password("h2")
// .driverClassName("org.h2.Driver")
.build();
}
}
Tout ce que vous avez à faire est d’annoter une méthode qui renvoie un DataSource avec @Bean. Un exemple de travail complet suit.
@Bean
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url(dbUrl);
dataSourceBuilder.username(username);
dataSourceBuilder.password(password);
return dataSourceBuilder.build();
}
Si vous voulez plus de config de datesource, par exemple.
spring.datasource.test-while-idle=true
spring.datasource.time-between-eviction-runs-millis=30000
spring.datasource.validation-query=select 1
vous pouvez utiliser le code ci-dessous
@Bean
public DataSource dataSource() {
DataSource dataSource = new DataSource(); // org.Apache.Tomcat.jdbc.pool.DataSource;
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setTestWhileIdle(testWhileIdle);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMills);
dataSource.setValidationQuery(validationQuery);
return dataSource;
}
Si vous utilisez la dernière botte de printemps (avec jdbc starter et Hikari), vous rencontrerez: _Java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
_ Pour résoudre ceci:
_datasource.Oracle.url=youroracleurl
_
@Primary
_ est obligatoire!):_@Bean
@Primary
@ConfigurationProperties("datasource.Oracle")
public DataSourceProperties getDatasourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("datasource.Oracle")
public DataSource getDatasource() {
return getDatasourceProperties().initializeDataSourceBuilder()
.username("username")
.password("password")
.build();
}
_
Vous pouvez également utiliser DriverManagerDataSource comme:
public DataSource getDataSource(DBInfo db) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername(db.getUsername());
dataSource.setPassword(db.getPassword());
dataSource.setUrl(db.getUrl());
dataSource.setDriverClassName(db.getDriverClassName());
return dataSource;
}
Attention toutefois à l'utiliser, car:
REMARQUE: cette classe n'est pas un pool de connexions réel. il ne regroupe pas réellement les connexions. Il ne sert que de simple remplacement pour un pool de connexions complet, implémentant la même interface standard, mais créant de nouvelles connexions à chaque appel. référence