2

Java アプリ エンジンから PostgreSQL サーバーに接続しようとしています。私のローカル マシン コードでは問題なく動作しますが、コードを 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)

私は postgresql-9.2-1003.jdbc4.jar を使用しており、この jdbc をライブラリとして、また "war/WEB-INF/lib" フォルダー内に持っています。私の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();
                    }
                }
        }
    }
}
4

3 に答える 3

3

Google は jdbc の送信を許可せず、http の送信のみを許可します。

Google Secure Data Connector を見てください (非推奨ですが、2015 年まで動作します)。

Google App Engine からの接続は HTTP ベースのみです。

Google クラウド SQL

Google Cloud SQL には、ぜひご覧になりたい機能がいくつかあります: https://developers.google.com/cloud-sql/ </p>

HTTP 経由の JDBC

http 経由でデータベースにアクセスするためのソリューションがあります (例: http://vjdbc.sourceforge.net/ http://sourceforge.net/projects/sqlgateway/など) 。

URL フェッチ API

App Engine アプリケーションは、他のアプリケーションと通信したり、URL をフェッチしてウェブ上の他のリソースにアクセスしたりできます。アプリは URL 取得サービスを使用して、HTTP および HTTPS 要求を発行し、応答を受信できます。URL 取得サービスは、効率とスケーリングのために Google のネットワーク インフラストラクチャを使用します。 https://developers.google.com/appengine/docs/python/urlfetch/

ソケット API

App Engine は、java.net.Socket や java.net.DatagramSocket などの通常の送信 Java ソケットをサポートしています。現在、java.nio.SocketChannel またはその他の java.nio クラスによるソケットのサポートはありません。ソケットは有料アプリでのみ利用可能です! (Peter Knego が言及したアウトバウンドの別の使用方法) https://developers.google.com/appengine/docs/java/sockets/

しかし、私はお勧めしません (パブリック IP を使用して、インターネット経由で外部データベースに簡単にアクセスする)。

于 2013-09-12T11:36:47.893 に答える
2

GAE から PostgreSQL に接続できました!

このjdbcを使用する必要があります-

postgresql-8.3-607.jdbc2ee.jar

ソケットを有効にする必要があります

それでも、皆さんの提案と回答に感謝します

于 2013-09-16T13:26:50.413 に答える
0

driverclass (org.postgresql.Driver) をロードするのを忘れました。ドライバー jar をアプリケーションの lib フォルダーに追加してください。

    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();
     } 
于 2013-09-12T11:39:54.587 に答える