简体   繁体   English

在Java App Engine中连接到PostgreSQL

[英]Connecting to PostgreSQL in java app engine

I'm trying to connect to PostgreSQL server from java app engine. 我正在尝试从Java应用程序引擎连接到PostgreSQL服务器。 On my local machine code works perfectly, but when I deploy code to appengine, I get this exception: 在我的本地机器上,代码可以完美运行,但是当我将代码部署到appengine时,出现以下异常:

Uncaught exception from servlet
java.lang.NullPointerException
    at com.google.appengine.runtime.Request.process-3a02a4d7b73299fa(Request.java)
    at java.util.Hashtable.put(Hashtable.java:432)
    at java.util.Properties.setProperty(Properties.java:161)
    at org.postgresql.Driver.loadDefaultProperties(Driver.java:121)
    at org.postgresql.Driver.access$000(Driver.java:46)
    at org.postgresql.Driver$1.run(Driver.java:88)
    at java.security.AccessController.doPrivileged(AccessController.java:63)
    at org.postgresql.Driver.getDefaultProperties(Driver.java:85)
    at org.postgresql.Driver.connect(Driver.java:231)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:221)
    at guestbook.PostgreServlet.doGet(PostgreServlet.java:49)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    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 com.google.appengine.tools.appstats.AppstatsFilter.doFilter(AppstatsFilter.java:141)
    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$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:435)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    at java.lang.Thread.run(Thread.java:722)

I am using postgresql-9.2-1003.jdbc4.jar and I have this jdbc as library and also inside my "war/WEB-INF/lib" folder. 我正在使用postgresql-9.2-1003.jdbc4.jar,并且将此jdbc作为库,也放在我的“ war / WEB-INF / lib”文件夹中。 My java code is here: 我的Java代码在这里:

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PostgreServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter pw = resp.getWriter();

        Connection conn = null;
        String result = "";
        try {
            conn = DriverManager.getConnection("jdbc:postgresql://xx.xxx.xxx.xxx:xxxx/xxxxx", "xxx", "xxxx");           
            if(conn == null){
                pw.println("Connection null");
                return;
            }
            ResultSet rs = conn.createStatement().executeQuery(
                    "SELECT * FROM pg_catalog.pg_tables");
            while (rs.next()) {
                result += rs.getString("tablename") + "<br>";
            }
            pw.println(result);

        } catch (SQLException e) {
            e.printStackTrace();
        } 
            finally {
                if(conn != null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
        }
    }
}

Google don't allow jdbc out, only http out. Google不允许jdbc out,仅允许http out。

Look at Google Secure Data Connector (which is deprecated, but works until 2015). 查看Google安全数据连接器(已弃用,但可使用到2015年)。

Connections out from the Google App Engine are only HTTP based! Google App Engine的连接仅基于HTTP!

Google Cloud SQL Google Cloud SQL

There is some functionality in Google Cloud SQL that you might wanna look at: https://developers.google.com/cloud-sql/ 您可能要查看Google Cloud SQL中的某些功能: https : //developers.google.com/cloud-sql/

JDBC over HTTP 通过HTTP的JDBC

There are solutions to reach databases over http (eg http://vjdbc.sourceforge.net/ http://sourceforge.net/projects/sqlgateway/ etc) 有一些解决方案可以通过http访问数据库(例如http://vjdbc.sourceforge.net/ http://sourceforge.net/projects/sqlgateway/等)

The URLFetch API URLFetch API

App Engine applications can communicate with other applications or access other resources on the web by fetching URLs. App Engine应用程序可以通过获取URL与其他应用程序进行通信或访问网络上的其他资源。 An app can use the URL Fetch service to issue HTTP and HTTPS requests and receive responses. 应用程序可以使用URL Fetch服务来发出HTTP和HTTPS请求并接收响应。 The URL Fetch service uses Google's network infrastructure for efficiency and scaling purposes. URL提取服务使用Google的网络基础结构来提高效率和扩展规模。 https://developers.google.com/appengine/docs/python/urlfetch/ https://developers.google.com/appengine/docs/python/urlfetch/

Socket API 套接字API

App Engine supports regular outbound Java sockets such as java.net.Socket and java.net.DatagramSocket. App Engine支持常规出站Java套接字,例如java.net.Socket和java.net.DatagramSocket。 There is currently no support for sockets via java.nio.SocketChannel or other java.nio classes. 当前不通过java.nio.SocketChannel或其他java.nio类支持套接字。 Sockets are only available for paid apps! 套接字仅适用于付费应用! (another way to use outbounds, mentioned by Peter Knego) https://developers.google.com/appengine/docs/java/sockets/ (Peter Knego提到的另一种使用出站方式) https://developers.google.com/appengine/docs/java/sockets/

But I would not recommend (accessing external databases easily over internet, with public IPs) , this solution are no-no for me, it is a high security issue - my opinion! 但是我不建议(使用公共IP通过Internet轻松访问外部数据库),此解决方案对我来说是不行的,这是一个高度安全的问题-我认为!

Connecting to PostgreSQL from GAE Can be done! 从GAE连接到PostgreSQL 可以完成!

You have to use this jdbc - 您必须使用此jdbc-

postgresql-8.3-607.jdbc2ee.jar

and you must have Sockets enabled 并且必须启用套接字

But still, thank you all for your suggestions and answers 但是,还是谢谢大家的建议和解答

You forgot to load the driverclass (org.postgresql.Driver). 您忘记加载驱动程序类(org.postgresql.Driver)。 Please add the driver jar into your application lib folder. 请将驱动程序jar添加到您的应用程序li​​b文件夹中。

    try {

           Class.forName("org.postgresql.Driver"); //You forgot to load the driver 
           conn = DriverManager.getConnection("jdbc:postgresql://xx.xxx.xxx.xxx:xxxx/xxxxx", "xxx", "xxxx");           
        if(conn == null){
            pw.println("Connection null");
            return;
        }
        ResultSet rs = conn.createStatement().executeQuery(
                "SELECT * FROM pg_catalog.pg_tables");
        while (rs.next()) {
            result += rs.getString("tablename") + "<br>";
        }
        pw.println(result);

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

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

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