java - with - Configure DataSource mediante programación en Spring Boot
what is jndi datasource in java (7)
Con Spring Boot puedo crear una instancia de
JdbcTemplate
con lo siguiente:
Código:
@Autowired
private JdbcTemplate jdbcTemplate;
Propiedades:
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
Esto crea un DataSource de clase:
org.apache.tomcat.jdbc.pool.DataSource
¿Cómo configuro el nombre de usuario / contraseña de DataSource mediante programación?
Tenemos una política de no almacenar credenciales en texto sin formato y tengo que usar un proveedor de credenciales específico donde trabajo.
Como alternativa, puede usar DriverManagerDataSource como:
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;
}
Sin embargo, tenga cuidado al usarlo, porque:
NOTA: esta clase no es un grupo de conexiones real; en realidad no agrupa las conexiones. Simplemente sirve como un reemplazo simple para un grupo de conexiones completo, implementando la misma interfaz estándar, pero creando nuevas conexiones en cada llamada. reference
Mi proyecto de arranque de primavera se ha ejecutado normalmente de acuerdo con su ayuda. La configuración del origen de datos yaml es:
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
Fuente de datos personalizada
@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();
}
}
Puede usar
DataSourceBuilder
si está usando
jdbc
starter.
Además, para anular el bean de configuración automática predeterminado, debe marcar su bean como
@Primary
En mi caso, tengo propiedades que comienzan con el prefijo
datasource.postgres
.
P.ej
@ConfigurationProperties(prefix = "datasource.postgres")
@Bean
@Primary
public DataSource dataSource() {
return DataSourceBuilder
.create()
.build();
}
Si no es factible para usted, puede usar
@Bean
@Primary
public DataSource dataSource() {
return DataSourceBuilder
.create()
.username("")
.password("")
.url("")
.driverClassName("")
.build();
}
Si desea más configuraciones de fuente de fechas, por ejemplo
spring.datasource.test-while-idle=true
spring.datasource.time-between-eviction-runs-millis=30000
spring.datasource.validation-query=select 1
podrías usar el siguiente código
@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;
}
consulte: Spring boot jdbc Connection
Si está utilizando el último arranque de primavera (con jdbc starter y Hikari), se encontrará con:
java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
Para resolver esto:
- En su application.properties:
datasource.oracle.url=youroracleurl
-
En su aplicación, defina como bean (¡
@Primary
es obligatorio! ):
@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();
}
Todo lo que necesita hacer es anotar un método que devuelva un DataSource con @Bean. Sigue un ejemplo de trabajo completo.
@Bean
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url(dbUrl);
dataSourceBuilder.username(username);
dataSourceBuilder.password(password);
return dataSourceBuilder.build();
}
para springboot 2.1.7, trabajar con url parece no funcionar. cambie con jdbcUrl en su lugar.
En propiedades:
security: datasource: jdbcUrl: jdbc:mysql://ip:3306/security username: user password: pass
En java:
@ConfigurationProperties(prefix = "security.datasource") @Bean("dataSource") @Primary public DataSource dataSource(){ return DataSourceBuilder .create() .build(); }