[英]Connecting to PostgreSQL in java app engine
我正在尝试从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();
}
}
}
}
}
Google不允许jdbc out,仅允许http out。
查看Google安全数据连接器(已弃用,但可使用到2015年)。
Google App Engine的连接仅基于HTTP!
Google Cloud SQL
您可能要查看Google Cloud SQL中的某些功能: https : //developers.google.com/cloud-sql/
通过HTTP的JDBC
有一些解决方案可以通过http访问数据库(例如http://vjdbc.sourceforge.net/ http://sourceforge.net/projects/sqlgateway/等)
URLFetch API
App Engine应用程序可以通过获取URL与其他应用程序进行通信或访问网络上的其他资源。 应用程序可以使用URL Fetch服务来发出HTTP和HTTPS请求并接收响应。 URL提取服务使用Google的网络基础结构来提高效率和扩展规模。 https://developers.google.com/appengine/docs/python/urlfetch/
套接字API
App Engine支持常规出站Java套接字,例如java.net.Socket和java.net.DatagramSocket。 当前不通过java.nio.SocketChannel或其他java.nio类支持套接字。 套接字仅适用于付费应用! (Peter Knego提到的另一种使用出站方式) https://developers.google.com/appengine/docs/java/sockets/
但是我不建议(使用公共IP通过Internet轻松访问外部数据库),此解决方案对我来说是不行的,这是一个高度安全的问题-我认为!
从GAE连接到PostgreSQL 可以完成!
您必须使用此jdbc-
postgresql-8.3-607.jdbc2ee.jar
并且必须启用套接字
但是,还是谢谢大家的建议和解答
您忘记加载驱动程序类(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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.