即使使用' Always On' Cloud SQL数据库似乎总是关闭激活

时间:2014-12-07 23:13:37

标签: java google-cloud-sql

我正在对Google Cloud SQL进行基准测试。我开始使用默认的" On Demand"激活策略,因为我在一个测试平台上工作,只有很少的点击来节省一些$。

首次查询需要大约20-30秒(我认为这是由启动数据库引起的)。在那之后,表现很棒。

现在我切换到"始终开启"激活政策。我期待在我网站上的第一次请求中获得完全相同的响应时间。但是:就像" On Demand"策略,重新连接到数据库大约需要30秒。尝试重新连接到数据库的连接池花费的时间,所以我确定它是Cloud SQL时间。

我怀疑"永远在线"政策什么都不做(除了可能花费更多$?我还没有检查)我感觉数据库继续关闭。也许它稍微改变了超时策略?

我发现了这个帖子: First connect from Prestashop to Google Cloud SQL always fails

显然仍有超时,但我们可以根据结算方案进行更改吗? 这对我来说非常不清楚。

所以这是我的问题:

  • "始终开启" SQL实例的超时时间是多长?政策与"每次使用"帐单?
  • "始终开启" SQL实例的超时时间是多长?政策与"包"帐单?
  • 有没有办法可以手动设置自己的超时时间?毕竟,我是付钱的人...如果我希望我的实例继续运行,那就是我的问题。

修改

我确定这是一个连接问题,因为我以前在Web请求上有3秒超时。设置此超时后,我的所有请求都抛出以下异常:

Caused by: java.sql.SQLException: Cannot get a connection, general error
    at org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:130)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1412)
    at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:148)
    at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:71)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
        ... 27 more
Caused by: java.lang.InterruptedException
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2017)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2052)
        at org.apache.tomcat.dbcp.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:582)
        at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:439)
        at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:360)
        at org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:118)
        ... 31 more

1 个答案:

答案 0 :(得分:1)

在Cloud SQL支持的帮助下,问题显然来自我的GCE服务器"忘记" 10分钟后连接tcp。由于它是一个测试服务器,因此从那里到Cloud SQL实例的连接是长期未使用的连接。

因此,为了解决这个问题,我使用了tcp keepalive,正如Google建议的那样:

sudo bash -c 'echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time'

有关此配置的信息,请访问https://cloud.google.com/sql/docs/gce-access(第6部分)。

在设置此设置后,不要忘记重新启动任何连接到Cloud SQL实例的应用程序。