在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文件对不对。