我正在尝试连接到mysql数据库。当我试图通过mysql Workbench连接时,我只能通过java应用程序,它说:

Caused by: java.sql.SQLException: Access denied for user 'root'@'1.2.3.4' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:926)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1748)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1288)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2506)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2539)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2321)

数据源定义为:
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://3.3.3.3:3306"/>
    <property name="username" value="root"/>
    <property name="password" value="12345"/>
</bean>

在数据库中,用户权限表是:
'root'@'%', 'def', 'USAGE', 'NO'

请帮我解决这个问题好吗?
编辑:
我正在使用jdbcTemplate,错误就在这一行:
getJdbcTemplate().queryForList(sql.toString());

最佳答案

除了已经拥有的'root'@'localhost'帐户(使用相同的密码),还需要为'root'@'%'创建一个帐户。为什么?请参见mysql docs on this subject。以下是相关部分:
其中两个帐户的用户名是monty,密码是some_pass。这两个帐户都是超级用户帐户,具有执行任何操作的完全权限。“monty”@“local host”帐户只能在从本地主机连接时使用。“monty”@“%”帐户对主机部分使用“%”通配符,因此可以使用它从任何主机进行连接。
必须同时拥有monty的两个帐户,才能从monty的任何位置进行连接。如果没有local host帐户,那么当monty从本地主机连接时,mysql_install_db创建的localhost的匿名用户帐户将优先。因此,蒙蒂将被视为匿名用户。原因是匿名用户帐户的主机列值比“monty”@“%”帐户的值更具体,因此在用户表排序顺序中位于前面。(用户表排序在第6.2.4节“访问控制,第1阶段:连接验证”中讨论。)

07-27 21:34