0

我正在Google Compute Instance上使用Google Cloud SQL驱动程序,以在长时间运行的批处理过程中将结果保留到Google Cloud SQL数据库。如何在使用Google Cloud SQL JDBC驱动程序时刷新OAuth令牌?

在某些时候,或许运行的第一个小时后,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并重新启动批处理过程,连接将会正常,直到令牌再次到期。

显然,命令行工具在连接之前正在做一些刷新令牌的操作;我如何对我的批处理进行同样的操作?

+0

什么是google_sql.sh? – pinoyyid

+0

@pinoyyid google_sql.sh是谷歌云SDK中提供的命令行工具,它启动了com.google.cloud.sql.tool.googleapi.SqlTool。这显然做了一些刷新认证令牌,但没有记录。 – akbertram

+0

明白了。我会做一些挖掘 – pinoyyid

回答

0

云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>