Spring配置数据源遇到的奇妙问题

在Spring配置数据源的时候遇到了一个奇妙的问题

<context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>

        <!--<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///mydatabase"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>-->
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

使用SpringJunit做了一个简单的测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class DataSourceTest {

    @Autowired
    private DataSource dataSource;

    @Test
    public void test() throws SQLException {
        System.out.println("dataSource = " + dataSource);
        Connection connection = dataSource.getConnection();
        System.out.println("connection = " + connection);
    }
}

在配置文件中直接写明连接字符就没有问题

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///mydatabase"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
</bean>

控制台打印:

信息: {dataSource-1} inited
dataSource = {
    CreateTime:"2021-08-27 15:48:35",
    ActiveCount:1,
    PoolingCount:0,
    CreateCount:1,
    DestroyCount:0,
    CloseCount:0,
    ConnectCount:1,
    Connections:[
    ]
}
connection = com.mysql.cj.jdbc.ConnectionImpl@13b6aecc

当我采用加载jdbc.properties时,运行就会出错

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
</bean>

控制台打印

dataSource = {
    CreateTime:"2021-08-27 15:55:23",
    ActiveCount:0,
    PoolingCount:0,
    CreateCount:0,
    DestroyCount:0,
    CloseCount:0,
    ConnectCount:0,
    Connections:[
    ]
}
八月 27, 2021 3:55:23 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl error
严重: testWhileIdle is true, validationQuery not set
八月 27, 2021 3:55:23 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
八月 27, 2021 3:55:24 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl error
严重: create connection error
java.sql.SQLException: Access denied for user 'Echo'@'localhost' (using password: YES)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1375)
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1431)
    at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:1844)

对比前后DataSource中的ActiveCount属性发现第二次是为0的,不知道为什么。
明明两种配置方式没有什么不同,为什么采用加载配置文件的方式就会出错呢?

用户名或密码错误。
你配置文件配置可能有问题,比如参数值后面多了空格。

你配置文件的值是什么,发出来看看,是不是把ip配成localhost了?

classpath换成classpath星()再试试, xml我在spring4.x上面确实复现了这个问题(偶现),有时候它会莫名其妙的拿不到配置信息,换成classpath就没问题了

java.sql.SQLException: Access denied for user 'Echo'@'localhost' (using password: YES)
这个用户名和你明文配置的用户名root不一致。
检查你加载的properties文件对不对。