2017-01-17 34 views
1

我是Google App Engine的新手。 我想在我的maven GAE中使用myBatis连接到google cloudSQL。cannotGetJdbcConnectionException与myBatis + GAE + cloudSQL

当我从云中选择数据时,我会得到异常。

起初,我觉得可能是一个SQL语句的问题,但我不能找到它......

然后,当我改变了我的SQL语句转换为“更新”, 例外也

改变
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Internal error. 

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Internal error. 

所以我认为在我的SQL语句没有错误。我的应用程序可以读取XML文件并成功结合SQL语句。问题是我无法获得jdbcConnection ...但是为什么?

任何人都可以提出一些建议......?

谢谢!

这里是我的代码和例外:

例外

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Internal error. 
### The error may exist in gcloud/myapp/sqlMap/mytestProject.xml 
### The error may involve mytestProject.getAllChara 
### The error occurred while executing a query 
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Internal error. 
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365) 
at com.sun.proxy.$Proxy16.selectList(Unknown Source) 
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:188) 
at gcloud.myapp.dao.CharacterDataDao.getAllChara(CharacterDataDao.java:29) 
at gcloud.myapp.service.MytestProjectService.getAllCharaTest(MytestProjectService.java:36) 
at gcloud.myapp.controller.MytestProjectController.to_index(MytestProjectController.java:25) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:42) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:177) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) 
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:617) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) 
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:276) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:320) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:312) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Internal error. 
### The error may exist in gcloud/myapp/sqlMap/mytestProject.xml 
### The error may involve mytestProject.getAllChara 
### The error occurred while executing a query 
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Internal error. 
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23) 
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104) 
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95) 
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:91) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:42) 
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355) 
... 42 more 
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Internal error. 
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) 
at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) 
at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:66) 
at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:279) 
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:69) 
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:56) 
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267) 
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:141) 
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105) 
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81) 
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101) 
... 49 more 
Caused by: java.sql.SQLException: Internal error. 
at com.google.appengine.api.rdbms.RdbmsApiProxyClient$ApiProxyBlockingInterface.makeSyncCall(RdbmsApiProxyClient.java:109) 
at com.google.appengine.api.rdbms.RdbmsApiProxyClient$ApiProxyBlockingInterface.openConnection(RdbmsApiProxyClient.java:71) 
at com.google.cloud.sql.jdbc.internal.SqlProtoClient.openConnection(SqlProtoClient.java:58) 
at com.google.cloud.sql.jdbc.Driver.connect(Driver.java:65) 
at com.google.cloud.sql.jdbc.Driver.connect(Driver.java:25) 
at com.google.appengine.api.rdbms.AppEngineDriver.connect(AppEngineDriver.java:83) 
at java.sql.DriverManager.getConnection(DriverManager.java:571) 
at java.sql.DriverManager.getConnection(DriverManager.java:187) 
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:173) 
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:164) 
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149) 
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119) 
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
... 59 more 

控制器

package gcloud.myapp.controller; 

import java.io.IOException; 
import java.sql.SQLException; 
import java.util.List; 
import java.util.Map; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 

import gcloud.myapp.service.MytestProjectService; 

@Controller 
public class MytestProjectController { 

    @Autowired 
    MytestProjectService mytestProjectService = new MytestProjectService(); 

    @RequestMapping("/") 
    public String to_index(Model model) throws SQLException, IOException { 
     List<Map<String, String>> charaList = mytestProjectService.getAllCharaTest(); 
     model.addAttribute("charaList", charaList); 
     return "index"; 
    } 
} 

服务

package gcloud.myapp.service; 

import java.io.IOException; 
import java.sql.SQLException; 
import java.util.List; 
import java.util.Map; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import gcloud.myapp.dao.CharacterDataDao; 

@Service("MytestProjectService") 
public class MytestProjectService implements IMytestProjectService { 

    @Autowired 
    CharacterDataDao characterDataDao = new CharacterDataDao(); 

    @Override 
    public List<Map<String, String>> getAllCharaTest() throws SQLException, IOException{ 
     List<Map<String, String>> charaList = characterDataDao.getAllChara(); 

     return charaList; 
    } 
} 

package gcloud.myapp.dao; 

import java.sql.SQLException; 
import java.util.List; 
import java.util.Map; 
import org.mybatis.spring.support.SqlSessionDaoSupport; 
import java.io.IOException; 

public class CharacterDataDao extends SqlSessionDaoSupport implements ICharacterDataDao { 

    @Override 
    public List<Map<String, String>> getAllChara() throws SQLException, IOException { 
     List<Map<String, String>> charaList = getSqlSession().selectList("getAllChara"); 

     return charaList; 
    } 
} 

SQLMAP(mytestProject.xml)

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 

<mapper namespace="mytestProject"> 
    <resultMap id="charaListMap" type="java.util.Map"> 
     <result property="id" column="ID" jdbcType="VARCHAR" /> 
     <result property="name" column="CHARANAME_CH" jdbcType="VARCHAR" /> 
    </resultMap> 
    <select id="getAllChara" resultMap="charaListMap"> 
     <![CDATA[ 
     SELECT ID, CHARANAME_CH 
     FROM charainfo 
     ]]> 
    </select> 
</mapper> 

的MyBatis配置

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
    <mappers> 
     <mapper resource="gcloud/myapp/sqlMap/mytestProject.xml" /> 
    </mappers> 
</configuration> 

弹簧配置

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-4.1.xsd"> 

    <!-- basic --> 
    <context:component-scan base-package="gcloud.myapp" /> 

    <!-- basic --> 
    <!-- view , the rules defined to resolve the view names --> 
    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <!-- basic --> 
     <property name="prefix" value="/WEB-INF/page/" /> 
     <property name="suffix" value=".jsp" /> 
     <property name="order" value="1" /> 
    </bean> 

    <!-- sqlSessionFactory --> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.google.appengine.api.rdbms.AppEngineDriver" /> 
     <property name="url" value="jdbc:google:rdbms://mytestproject:mytestproject-db/mytestproject" /> 
     <property name="username" value="**my user name**" /> 
     <property name="password" value="**my password**" /> 
    </bean> 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation" value="/WEB-INF/config/SqlMapConfig.xml" /> 
    </bean> 
    <bean id="characterDataDao" class="gcloud.myapp.dao.CharacterDataDao"> 
     <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    </bean> 
</beans> 

的web.xml

<?xml version="1.0" encoding="utf-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <servlet> 
     <servlet-name>SpringServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <!-- if without "init-param", framework will try to load the application 
      context from a file named [servlet-name]-servlet.xml in WEB-INF directory. --> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/config/SpringConfig.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>SpringServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

POM

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <groupId>gcloud.myapp</groupId> 
    <artifactId>MytestProject</artifactId> 

    <properties> 
     <app.id>**my app id**</app.id> 
     <app.version>1</app.version> 

     <appengine.version>1.9.44</appengine.version> 
     <gcloud.plugin.version>1.9.44</gcloud.plugin.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <maven.compiler.source>1.7</maven.compiler.source> 
     <maven.compiler.target>1.7</maven.compiler.target> 
     <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation> 
     <archiveClasses>true</archiveClasses> 

     <org.springframework-version>4.1.6.RELEASE</org.springframework-version> 
    </properties> 

    <prerequisites> 
     <maven>3.3.9</maven> 
    </prerequisites> 

    <dependencies> 
     <!-- Compile/runtime dependencies --> 
     <dependency> 
      <groupId>com.google.appengine</groupId> 
      <artifactId>appengine-api-1.0-sdk</artifactId> 
      <version>${appengine.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 

     <!-- Test Dependencies --> 
     <dependency> 
      <groupId>com.google.appengine</groupId> 
      <artifactId>appengine-testing</artifactId> 
      <version>${appengine.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.google.appengine</groupId> 
      <artifactId>appengine-api-stubs</artifactId> 
      <version>${appengine.version}</version> 
      <scope>test</scope> 
     </dependency> 

     <!-- Spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context-support</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <!-- com.mysql.jdbc.Driver --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.21</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.cloud.sql</groupId> 
      <artifactId>mysql-socket-factory</artifactId> 
      <version>1.0.2</version> 
     </dependency> 

     <!-- mybatis --> 
     <dependency> 
      <groupId>org.mybatis</groupId> 
      <artifactId>mybatis</artifactId> 
      <version>3.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mybatis</groupId> 
      <artifactId>mybatis-spring</artifactId> 
      <version>1.1.1</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <!-- for hot reload of the web application--> 
     <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <archiveClasses>true</archiveClasses> 
        <webResources> 
         <!-- in order to interpolate version from pom into appengine-web.xml --> 
         <resource> 
          <directory>${basedir}/src/main/webapp/WEB-INF</directory> 
          <filtering>true</filtering> 
          <targetPath>WEB-INF</targetPath> 
         </resource> 
        </webResources> 
       </configuration> 
      </plugin> 
       <plugin> 
       <groupId>com.google.appengine</groupId> 
       <artifactId>appengine-maven-plugin</artifactId> 
       <version>${appengine.version}</version> 
       <configuration> 
        <enableJarClasses>false</enableJarClasses> 
        <version>${app.version}</version> 
        <!-- Comment in the below snippet to bind to all IPs instead of just localhost --> 
        <!-- address>0.0.0.0</address> 
        <port>8080</port --> 
        <!-- Comment in the below snippet to enable local debugging with a remote debugger 
         like those included with Eclipse or IntelliJ --> 
        <!-- jvmFlags> 
         <jvmFlag>-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n</jvmFlag> 
        </jvmFlags --> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>com.google.appengine</groupId> 
       <artifactId>gcloud-maven-plugin</artifactId> 
       <version>${gcloud.plugin.version}</version> 
       <configuration> 
       <set_default>true</set_default> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

2017年1月18日下午3:40更新:

不CLOUDSQL授权问题。

我已经试过

Connection conn = DriverManager.getConnection("jdbc:google:mysql://**url**/**databaseName**?user=**userName**&password=**password**"); 

,并连接到数据库成功(可以做的SQL操作。)

回答

1

............解决它。

这只是一个dataSource的URL错误。

在我的弹簧配置

<!-- sqlSessionFactory --> 
<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.google.appengine.api.rdbms.AppEngineDriver" /> 
    <property name="url" value="jdbc:google:rdbms://mytestproject:mytestproject-db/mytestproject" /> 
    <property name="username" value="**my user name**" /> 
    <property name="password" value="**my password**" /> 
</bean> 

变化

<property name="url" value="jdbc:google:rdbms://mytestproject:mytestproject-db/mytestproject" />

<property name="url" value="jdbc:google:mysql://mytestproject:us-central1:mytestproject-db/mytestproject" />

,然后它的作品。