在 Google App Engine 中使用 h2 数据库进行本地开发

Posted

技术标签:

【中文标题】在 Google App Engine 中使用 h2 数据库进行本地开发【英文标题】:Using h2 database for local development in Google App Engine 【发布时间】:2017-09-18 10:52:31 【问题描述】:

我正在开发一个 Google App Engine 应用程序。在生产中我计划使用 Google Cloud SQL,但在开发中我想使用 h2 数据库。它在使用内存和嵌入式数据库 (jdbc:h2:mem/dev/jdbc:h2:~/folder/dev) 时工作​​正常,但不适用于启用服务器的数据库 (jdbc:h2:~/folder/dev;AUTO_SERVER=TRUE),它会失败并出现以下错误:

org.h2.jdbc.JdbcSQLException: IO Exception: "java.net.SocketException: Permission denied: Not allowed to issue a socket bind: permission denied."; "port: 0 ssl: false" [90031-168]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:158)
at org.h2.message.DbException.convertIOException(DbException.java:315)
at org.h2.util.NetUtils.createServerSocketTry(NetUtils.java:193)
at org.h2.util.NetUtils.createServerSocket(NetUtils.java:156)
at org.h2.server.TcpServer.start(TcpServer.java:222)
at org.h2.tools.Server.start(Server.java:455)
at org.h2.engine.Database.startServer(Database.java:672)
at org.h2.engine.Database.open(Database.java:544)
at org.h2.engine.Database.openDatabase(Database.java:222)
at org.h2.engine.Database.<init>(Database.java:217)
at org.h2.engine.Engine.openSession(Engine.java:56)
at org.h2.engine.Engine.openSession(Engine.java:159)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138)
at org.h2.engine.Engine.createSession(Engine.java:121)
at org.h2.engine.Engine.createSession(Engine.java:28)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:305)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92)
at org.h2.Driver.connect(Driver.java:72)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)

据我了解,这是 GAE 的局限性。这使我无法在应用程序运行时轻松访问数据库。有没有办法只在本地服务器模式下绕过这个问题?我很好奇是否有在开发模式下使用 mysql 数据库的替代方法。

【问题讨论】:

【参考方案1】:

目前也在 GAE 中尝试 H2。由于内存和可写磁盘,标准环境对我来说是行不通的:最大 1Gb 与 F4-1G 实例。 如果 h2 嵌入模式有效,您必须使用灵活,因为标准只允许 /tmp 进行写入操作。 关于错误本身,GAE 不允许侦听套接字,因此很遗憾,无论环境类型如何,都没有自动服务器 (https://cloud.google.com/appengine/docs/standard/java/sockets/)

【讨论】:

以上是关于在 Google App Engine 中使用 h2 数据库进行本地开发的主要内容,如果未能解决你的问题,请参考以下文章

在 Google App Engine 中使用 Cron 作业

如何在 Google App Engine 中设置我的默认版本

使用 rtmplite 在 Google App Engine 中录制音频?

Google App Engine:在 Python 中使用自定义入口点

如何在 Google App Engine 标准环境中使用 Google Cloud Build 或其他方法设置环境变量?

在 Google App Engine 中触发功能涉及哪些成本?