2013-09-12 3 views
2

Я пытаюсь подключиться к серверу PostgreSQL из java-приложения. На моей локальной машине код работает отлично, но когда я раскрываю код на AppEngine, я получаю это исключение:Подключение к PostgreSQL в движке java-приложения

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(); 
        } 
       } 
     } 
    } 
} 

ответ

2

Подключение к PostgreSQL из GAE Может быть сделано!

Вы должны использовать этот JDBC -

postgresql-8.3-607.jdbc2ee.jar 

и вы должны иметь Sockets включен

Но все же, спасибо всем за ваши предложения и ответы

3

Google не позволяют JDBC из только HTTP вне.

Посмотрите на Google Secure Data Connector (который устарел, но работает до 2015 года).

Соединения из Google App Engine основаны только на HTTP!

Google Cloud SQL

Существует некоторая функциональность в Google Cloud SQL, которые вы могли бы хотеть смотреть на: https://developers.google.com/cloud-sql/

JDBC через HTTP

Есть решения, чтобы достичь баз данных по http (например, http://vjdbc.sourceforge.net/http://sourceforge.net/projects/sqlgateway/ и т. д.)

API URLFetch

Приложения App Engine могут взаимодействовать с другими приложениями или получать доступ к другим ресурсам в Интернете путем выбора URL-адресов. Приложение может использовать службу URL Fetch для передачи запросов HTTP и HTTPS и получения ответов. Служба URL Fetch использует сетевую инфраструктуру Google для повышения эффективности и масштабирования. https://developers.google.com/appengine/docs/python/urlfetch/

Оправа API

App Engine поддерживает регулярные исходящие Java сокетов, таких как java.net.Socket и java.net.DatagramSocket. В настоящее время нет поддержки сокетов через java.nio.SocketChannel или другие классы java.nio. Розетки доступны только для платных приложений! не (другой способ использования будет выхода, упомянутый Питером Knego) https://developers.google.com/appengine/docs/java/sockets/

Но я бы не рекомендовал (доступ к внешним базам данных легко через Интернет, с общественными IP-адресами), это решение у кого нет-нет для меня, это проблема с высоким уровнем безопасности - мое мнение!

+0

, какое решение вы бы порекомендовали для доступа в эту базу данных? Я разрабатываю веб-приложение, которому необходимо получить доступ к нескольким базам данных (CloudSQL, MySQL и PostgreSQL). – Ajvo

+0

Я бы создал веб-службы, которые я могу получить из своего приложения GAE. (Может быть REST. Может использовать UrlFetch). В этом случае я бы контролировал свою базу данных и поддерживал низкую связь и зависимость между системами. – MrSimpleMind

+1

Я не смотрел на это глубоко, но это демо-версия python, которую вы можете получить от http://www.bloing.net/2011/01/soap-webservice-gae-python-howto/ – MrSimpleMind

0

Вы забыли загрузить драйвер класса (org.postgresql.Driver). Добавьте фразу драйвера в папку приложения 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(); 
    } 
+0

Я пробовал это раньше, и это не решило проблему. Поскольку jdbc4 вам не нужно регистрировать драйвер (см. Документацию DriverManager), но спасибо за помощь – Ajvo

Смежные вопросы