0

我在谷歌计算实例上使用谷歌云 SQL 驱动程序在长时间运行的批处理过程中将结果保存到谷歌云 SQL 数据库。

在某些时候,可能在运行的第一个小时之后,oAuth 令牌似乎过期了,并且所有后续请求都失败了:

Caused by: java.sql.SQLException: 400 Bad Request
{
   "error" : "unauthorized_client"
}
at com.google.cloud.sql.jdbc.internal.googleapi.RpcGoogleApi.newOpenConnectionIOException(RpcGoogleApi.java:168)
at com.google.cloud.sql.jdbc.internal.googleapi.RpcGoogleApi.openConnection(RpcGoogleApi.java:104)
at com.google.cloud.sql.jdbc.internal.SqlProtoClient.openConnection(SqlProtoClient.java:58)
at com.google.cloud.sql.jdbc.Driver.connect(Driver.java:66)
at com.google.cloud.sql.Driver.connectImpl(Driver.java:109)
at com.google.cloud.sql.Driver.connect(Driver.java:98)
at com.google.cloud.sql.Driver.connect(Driver.java:31)

我可以中止该过程,从客户端行运行 google_sql.sh 并重新启动批处理,并且连接会正常,直到令牌再次过期。

显然,命令行工具在连接之前正在做一些事情来刷新令牌;我如何为我的批处理做同样的事情?

4

2 回答 2

0

Cloud SQL 工具的客户端 ID 和密码需要提供给 JDBC 驱动程序,因为我们使用的是该特定工具检索到的令牌:https ://developers.google.com/cloud-sql/docs/external

Properties props = new Properties()
props.put("oauth2ClientId", "32555940559.apps.googleusercontent.com");
props.put("oauth2ClientSecret", "ZmssLNjJy2998hD4CTg2ejr2");
DriverManager.getConnection("jdbc:google:rdbms://instance_name/database_name", props);

如果您像我一样使用 Hibernate,则可以将其添加到 persistence.xml:

<persistence-unit name="renjin-repo" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  ...
  <properties>
  <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
    <property name="hibernate.hbm2ddl.auto" value="update"/>

    <property name="javax.persistence.jdbc.driver" value="com.google.cloud.sql.Driver"/>
    <property name="javax.persistence.jdbc.url" value="jdbc:google:rdbms://project:instance/database_name"/>
    <property name="javax.persistence.jdbc.user" value="root"/>

    <property name="hibernate.connection.oauth2ClientId" value="32555940559.apps.googleusercontent.com"/>
    <property name="hibernate.connection.oauth2ClientSecret" value="ZmssLNjJy2998hD4CTg2ejr2"/>
    <property name="hibernate.connection.pool_size" value="0" />
  </properties>
</persistence-unit>
于 2013-10-18T19:06:39.203 回答
0

Cloud SQL 团队正在努力改进 Compute Engine 的连接性。如果您将此问题发送到 google-cloud-sql-discuss@googlegroups.com,他们将能够跟进。

https://groups.google.com/forum/#!forum/google-cloud-sql-discuss

于 2013-10-17T00:23:16.573 回答