Spring配置DataSource时数据库用户名设置名称要注意

在使用Spring 4.3.2版本配置DataSource连接Oracle数据库时遇到问题,配置包括driverClassName、url、username和password。即便如此,仍能正常操作数据库,表明配置属性设置正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring版本4.3.2,配置DataSource连接Oracle时出现一个奇怪的现象,用下面的配置方法可以直接连接数据库,对数据库进行操作,说明这些属性值没有问题。

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
  <property name="url" value="jdbc:oracle:thin:@192.168.32.128:1521:XXXX" />
  <property name="username" value="scott" />
  <property name="password" value="123456" />
 </bean>

然后用加载jdbc.properties属性文件的方式,同样的属性值会报如下的错误
================================================================================================
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${driverClassName}" />
  <property name="url" value="${url}" />
  <property name="username" value="${username}" />
  <property name="password" value="${password}" />
 </bean>
=================================================================================================
jdbc.properties文件如下
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.32.128:1521:XXXX
username=scott
password=123456
=================================================================================================
报错信息
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (ORA-01017: invalid username/password; logon denied)
================================我是分割线,开启苦逼找碴模式==========================================
================================宝宝心里苦,但是宝宝不说==============================================
最后发现了,因为自己想偷下懒,想少敲几个字母的缘故。
在jdbc.properties中username一定不要写成username,写成jdbc.username或者username1都行,总之要和username区分开,然后就可以愉快地连接数据库了。
password可以是password,但username不能是username。
 
 
求大神解答上面的疑问,为什么username不能写成username ?
### 如何在Spring配置数据库用户名Spring框架中,可以通过多种方式来配置数据库连接的相关参数,包括用户名密码以及其他必要的属性。以下是几种常见的方法及其具体实现。 #### 方法一:通过 `application.properties` 或 `application.yml` 文件配置 这是最常见的方式之一,在基于Spring Boot的应用程序中尤为普遍。可以直接在配置文件中指定数据库用户名和其他必要信息。 对于 **`application.properties`** 的配置如下所示: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 如果使用的是 **YAML 格式的配置文件 (`application.yml`)** ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver ``` 以上配置中的 `username` 和 `password` 字段分别用于定义数据库的登录凭证[^2]。 --- #### 方法二:动态加载外部化配置(如 AWS Secrets Manager) 当应用程序运行于云环境中,出于安全性和灵活性考虑,通常会采用外部化的密钥管理系统存储敏感信息,比如AWS Secrets Manager。这种方式能够有效保护数据库凭据被硬编码到项目源码或版本控制系统中。 下面是一个具体的例子,展示了如何利用 `EnvironmentPostProcessor` 接口完成这一目标: 创建自定义处理器类并注册至 Spring 容器: ```java import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.env.ConfigurableEnvironment; @Order(Ordered.HIGHEST_PRECEDENCE) public class AwsSecretsManagerEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { String secretName = System.getenv("DB_SECRET_NAME"); try { Map<String, Object> secrets = fetchSecretFromAws(secretName); secrets.forEach((key, value) -> environment.getPropertySources() .addFirst(new MapPropertySource(key, Collections.singletonMap(key, value)))); } catch (Exception e) { throw new RuntimeException("Failed to load database credentials from AWS Secrets Manager", e); } } private Map<String, Object> fetchSecretFromAws(String secretName) throws Exception { AWSSecretsManager client = AWSSecretsManagerClientBuilder.defaultClient(); GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest().withSecretId(secretName); GetSecretValueResult getSecretValueResult = client.getSecretValue(getSecretValueRequest); if (getSecretValueResult.getSecretString() != null) { return new ObjectMapper().readValue(getSecretValueResult.getSecretString(), HashMap.class); } else { throw new IllegalArgumentException("No SecretString found in the response."); } } } ``` 上述代码片段实现了从 AWS Secrets Manager 中提取数据库用户名密码的功能,并将其注入到 Spring 环境变量中[^3]。 --- #### 方法三:手动编写 Java 配置类 除了依赖默认的自动装配机制外,还可以显式地声明一个Java Bean 来管理数据源实例。这种方法提供了更高的控制权,尤其适用于复杂场景下的定制需求。 示例代码如下: ```java import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.zaxxer.hikari.HikariDataSource; @Configuration public class DataSourceConfig { @Bean public DataSource dataSource() { HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl("jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC"); ds.setUsername("root"); // 设置数据库用户名 ds.setPassword("password"); // 设置数据库密码 ds.setMaximumPoolSize(10); // 可选:调整最大连接数 ds.setMinimumIdle(5); // 可选:保持最小空闲连接数量 return ds; } } ``` 这里我们选择了HikariCP作为底层的数据源实现工具,因为它以其高性能著称[^1]。 --- ### 总结 无论采取哪种方式进行配置,都需要确保所使用的用户名具有足够的权限去操作目标数据库表结构和服务接口。此外,建议始终遵循最佳实践原则——即尽可能减少暴露敏感信息的风险,优先选用加密传输协议以及可靠的第三方服务提供商解决方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值