gpt4 book ai didi

mysql - 从 sleep 中恢复应用程序会导致 'Communications link failure'

转载 作者:太空宇宙 更新时间:2023-11-03 11:05:13 24 4
gpt4 key购买 nike

我配置了一个运行良好的 CloudBees Run@cloud 实例,但在一段时间不活动后它会被停用,然后连接池似乎没有正确刷新。

当我返回站点时,前几个请求超时:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 4,746,680 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
sun.reflect.GeneratedConstructorAccessor86.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3092)
com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2978)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3526)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)
com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5022)
org.apache.tomcat.dbcp.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:371)
org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:328)
org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:87)
org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)

我使用在 cloudbees-web.xml 文件中配置的数据源通过 JNDI 进行连接:

    <resource name="jdbc/myapp" auth="Container" type="javax.sql.DataSource">
<param name="username" value="myuser" />
<param name="password" value="mypass" />
<param name="url" value="jdbc:cloudbees://myurl />
</resource>

我是否缺少某些配置,或者这是服务器中连接池配置的错误?

最佳答案

[来自 Database Guide在 CloudBees Wiki 上]

MySQL 包含一个超时机制,它将关闭长时间闲置的连接。为了提高数据库性能,CloudBees DataSources 使用 Apache DBCP 连接池在应用程序关闭后重用 JDBC 连接。

如果您使用在池中空闲时间过长的连接,您的应用程序可能会遇到以下错误:“从服务器成功接收的最后一个数据包是 XXX 秒前”。

连接池包含一个设置,该设置将在调用 javax.sql.DataSource.getConnection() 时验证并丢弃死连接。要使用此设置,请将以下 XML 参数添加到 cloudbees-web.xml 中的数据源定义中。

<param name="validationQuery" value="SELECT 1" />
<param name="testOnBorrow" value="true" />

因此对于您的资源,您应该能够执行以下操作:

<resource name="jdbc/myapp" auth="Container" type="javax.sql.DataSource">
<param name="username" value="myuser" />
<param name="password" value="mypass" />
<param name="url" value="jdbc:cloudbees://myurl />
<param name="validationQuery" value="SELECT 1" />
<param name="testOnBorrow" value="true" />
</resource>

如果你使用 bees app:bind 命令而不是 cloudbees-web.xml 来注入(inject)你的数据源,你可以使用这些参数作为命令的参数

bees app:bind -a APP_ID -db DB_NAME -as JNDI_ALIAS validationQuery="SELECT 1" testOnBorrow=true

关于mysql - 从 sleep 中恢复应用程序会导致 'Communications link failure',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com