我正在对Google Cloud SQL进行基准测试。我开始使用默认的" On Demand"激活策略,因为我在一个测试平台上工作,只有很少的点击来节省一些$。
首次查询需要大约20-30秒(我认为这是由启动数据库引起的)。在那之后,表现很棒。
现在我切换到"始终开启"激活政策。我期待在我网站上的第一次请求中获得完全相同的响应时间。但是:就像" On Demand"策略,重新连接到数据库大约需要30秒。尝试重新连接到数据库的连接池花费的时间,所以我确定它是Cloud SQL时间。
我怀疑"永远在线"政策什么都不做(除了可能花费更多$?我还没有检查)我感觉数据库继续关闭。也许它稍微改变了超时策略?
我发现了这个帖子: First connect from Prestashop to Google Cloud SQL always fails
显然仍有超时,但我们可以根据结算方案进行更改吗? 这对我来说非常不清楚。
所以这是我的问题:
修改
我确定这是一个连接问题,因为我以前在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
答案 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实例的应用程序。