繁体   English   中英

从Google App Engine Java连接到本地MySQL实例时出错。

[英]Error connecting to local MySQL instance from Google App Engine Java.

我已经使用gradle build插件创建了一个Google App Engine Java项目。 应用引擎版本为1.9.34。 我正在尝试将本地开发服务器连接到本地mysql数据库以进行开发和测试。 我正在尝试连接本地数据库,如下所示,

 try {
        Class.forName("com.mysql.jdbc.Driver");
        url = "jdbc:mysql://localhost/testDB?user=root";

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    Connection conn = null;
    try {
        conn = (Connection) DriverManager.getConnection(url, "root", "admin123$");

        String statement = "INSERT INTO entries (firstName, lastName, phoneNo, email) VALUES( ? , ? , ?, ?)";
        java.sql.PreparedStatement stmt = conn.prepareStatement(statement);
        stmt.setString(1, newContact.getFirstName());
        stmt.setString(2, newContact.getLastName());
        stmt.setString(3, newContact.getPhoneNumber());
        stmt.setString(4, newContact.getEmail());
        int success = 2;
        success = stmt.executeUpdate();
        if (success == 1) {

            System.out.println("Insert Successful");
        } else if (success == 0) {
            System.out.println("Insert error");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

但是不断收到以下错误,

SEVERE:在com.google.appengine.tools.development上的java.lang.Class.forName(Class.java:191)上的java.lang.Class.forName0(本地方法)中调用后端方法java.lang.ExceptionInInitializerError时发生异常。 com.mysql.jdbc.NonRegisteringDriver.connect上com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:65)的.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70) (NonRegisteringDriver.java:282)java.sql.DriverManager.getConnection(DriverManager.java:571)at java.sql.DriverManager.getConnection(DriverManager.java:215)at com.aarnam.whatsthescore.apis.AddressBookApi.createNewContact( AddressBookApi.java:67)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java com.google.appengine.tools.deve上的.lang.reflect.Method.invoke(Method.java:606) 位于com.google.api.server.spi.SystemServiceServlet的com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:363)上的lopment.agent.runtime.Runtime.invoke(Runtime.java:130)。在javax.servlet的javax.servlet.http.HttpServlet.service(HttpServlet.java:637)的com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:71)执行(SystemServiceServlet.java:113) org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)的.http.HttpServlet.service(HttpServlet.java:717)org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java) :1166)com的com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)at com.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)。 go.com.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:128)位于com.goog的org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) le.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)位于com.google.appengine.api.blobstore的org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)。 dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)位于or.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)的com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter。 java:50)在org.mortbay的com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)的org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)上的.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)在com.google.appengine.tools.development.DevAppServerModulesFilter .doDirectModuleRequest(DevAppServerModulesFilter.java:34 9)在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)在com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)在org.mortbay.jetty位于org.mortbay.jetty上的org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)的.servlet.ServletHandler.handle(ServletHandler.java:388)。(SessionHandler.java:182) )atg.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)at com.google.appengine.tools.development上的org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)。 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)上的DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)在com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle(JettyContainerService.java: 513),位于org.mortbay.jetty.Server.hand上的org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) le(Server.java:326)org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)atg.mortbay.jetty.HttpConnection $ RequestHandler.content(HttpConnection.java:938)org.mortbay.jetty .httpParser.parseNext(HttpParser.java:755)位于org.mortbay的org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)。 io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)atg.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)引起:java.security.AccessControlException:access denied(“java.lang。 RuntimePermission“”modifyThreadGroup“)java.security.AccessControl.checkPermission(AccessControlContext.java:372)java.security.AccessController.checkPermission(AccessController.java:559)java.lang.SecurityManager.checkPermission(SecurityManager.java:549) )com.google.appengine.tools.development.DevAppServerFactory $ CustomSecurityManager.checkPermission(DevAppServerF) actory.java:429)位于java.lang.Thread的java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)的com.google.appengine.tools.development.DevAppServerFactory $ CustomSecurityManager.checkAccess(DevAppServerFactory.java:454) .init(Thread.java:391)java.lang.Thread.init(Thread.java:349)java.lang.Thread。(Thread.java:445)java.util.TimerThread。(Timer.java: 499)java.util.Timer。(Timer.java:101)at java.util.Timer。(Timer.java:146)at com.mysql.jdbc.ConnectionImpl。(ConnectionImpl.java:208)... 53更多

自从过去几天以来一直困在这里。 任何帮助表示赞赏。

谢谢!!

您是否在App Engine Gradle中添加了以下依赖项?

compile 'mysql:mysql-connector-java:5.1.16'

如果是,您还可以检查将应用引擎的版本更改为1.9.18,它与我合作,我在过去的版本1.9.22及更高版本中遇到了问题。

首先,确保在appengine-web.xml启用了MySQL Connector / J,如下所示。

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  ...
  <use-google-connector-j>true</use-google-connector-j>
</appengine-web-app>

然后使用类似下面的代码片段连接到数据库。

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
    // Load the class that provides the new "jdbc:google:mysql://" prefix.
    Class.forName("com.mysql.jdbc.GoogleDriver");
    url = "jdbc:google:mysql://your-project-id:your-instance-name/your-database?user=root";
} else {
    // Local MySQL instance to use during development.
    Class.forName("com.mysql.jdbc.Driver");
    url = "jdbc:mysql://127.0.0.1:3306/your-database?user=root";

    // Alternatively, connect to a Google Cloud SQL instance using:
    // jdbc:mysql://ip-address-of-google-cloud-sql-instance:3306/your-database?user=root
}

你可以在这里找到更多细节。

实际上我已经尝试了上面提到的两个选项。 这两个更改都是使应用程序正常工作所必需的,但我的案例中的问题是mysql连接器版本。 我使用的是5.1.16,但随后将其更新为5.1.38,从而解决了该问题。

谢谢大家的帮助和建议! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM