2015-08-15 366 views
0

這對我來說似乎是一個奇怪的問題。雖然它看起來像JdbcTemplate的配置得當,jdbcTemplate.queryForObject失敗Spring JDBC - 無法連接到數據庫

o.a.tomcat.jdbc.pool.ConnectionPool  : Unable to create initial connections of pool. 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 

queryForObject被稱爲權利之前,我打印的jdbcTemplate.getDataSource().toString(),這確實顯示了正確的用戶名(像這樣:

...; url=jdbc:mysql://localhost/mydb; username=test; validationQuery=SELECT 1; ...)。

代碼:

public class JdbcLookupDao implements UserDao, OrderDao { 

    private final JdbcTemplate jdbcTemplate; 

    public JdbcLookupDao(JdbcTemplate jdbcTemplate) { 
     this.jdbcTemplate = jdbcTemplate; 
    } 

    @Override 
    public User findUser(String phone) { 
     System.out.println(jdbcTemplate.getDataSource().toString()); 

     return jdbcTemplate.queryForObject(//this line throws the exception 
       "SELECT * FROM users WHERE phonenumber = ?", 
       new Object[]{phone}, 
       new UserMapper() 
     ); 
    } 
.... 
} 

Spring配置文件:

... 
     <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
       <property name="driverClassName" value="${spring.datasource.driver-class-name}" /> 
       <property name="url" value="${spring.datasource.url}"/>" 
       <property name="username" value="${spring.datasource.username}"/> 
       <property name="password" value="${spring.datasource.password}"/> 
       <property name="validationQuery" value="${spring.datasource.validation-query}"/> 
     </bean> 

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

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

異常和堆棧跟蹤:

2015-08-15 23:00:16.123 ERROR 45791 --- [nio-8080-exec-1] o.a.tomcat.jdbc.pool.ConnectionPool  : Unable to create initial connections of pool. 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'lookup' 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) 
    at com.mysql.jdbc.Util.getInstance(Util.java:383) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) 
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1665) 
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1207) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249) 
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:794) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:307) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:200) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126) 
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:630) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737) 
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:805) 
    at com.lookup.aws.dao.JdbcLookupDao.findUser(JdbcLookupDao.java:36) 
    at com.lookup.aws.TestController.getUser(TestController.java:35) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

我希望有人能幫助我調試。 謝謝!

回答

1

問題是在MySQL中設置了權限。代碼中使用的用戶名無權訪問數據庫。

我想錯誤消息Access denied for ''@'localhost'是誤導 - 如果顯示實際的用戶名而不是'',這將是有意義的。

+1

它會一直顯示該用戶名,如果它已經能夠正確地解析XML,看到我的回答。 – muttonUp

0

檢查MySql上存在的屬性中定義的數據庫,或者檢查屬性文件中的url。此錯誤出現時: -

Connection con = DriverManager.getConnection(url); 

,因爲在這個時間點與數據庫的連接是越來越使用具有用戶名,密碼和數據庫或模式(甲骨文)的URL創建。所以你需要正確檢查網址。如果它存在於MySql服務器上,可以使用url或數據庫名稱。可能是因爲您在數據庫中更改了您的用戶名,並且仍然使用舊用戶名連接代碼。

1

它看起來像一個數據庫訪問權限問題。您需要在MYSQL Admin中爲用戶授予數據庫訪問權限。

1

你的Spring配置有missplaced雙qoute

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
      <property name="driverClassName" value="${spring.datasource.driver-class-name}" /> 
      <property name="url" value="${spring.datasource.url}"/>" 
      <property name="username" value="${spring.datasource.username}"/> 
      <property name="password" value="${spring.datasource.password}"/> 
      <property name="validationQuery" value="${spring.datasource.validation-query}"/> 
    </bean> 

在「url」屬性的盡頭有一個多餘的」,刪除,然後春天會正確地拿起用戶名和它注入到數據源。

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
      <property name="driverClassName" value="${spring.datasource.driver-class-name}" /> 
      <property name="url" value="${spring.datasource.url}"/> 
      <property name="username" value="${spring.datasource.username}"/> 
      <property name="password" value="${spring.datasource.password}"/> 
      <property name="validationQuery" value="${spring.datasource.validation-query}"/> 
    </bean> 
+0

是的!我沒有注意到它。 – shyam