错误记录
discard long time none received connection. , jdbcUrl : jdbc:mysql://localhost:3306/fish_myplus?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=true&useTimezone=true&serverTimezone=GMT%2B8, jdbcUrl : jdbc:mysql://localhost:3306/fish_myplus?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=true&useTimezone=true&serverTimezone=GMT%2B8, lastPacketReceivedIdleMillis : 165493
解决方案
这个错误提示表明你的数据库连接长时间没有收到数据包,导致连接被丢弃。这个问题通常出现在使用连接池时,连接池中的连接在空闲了一段时间后被数据库服务器自动关闭,但连接池并没有意识到这点,导致在使用这个连接时出现问题。
可能的原因:
- 数据库连接空闲超时:MySQL 服务器默认设置会在连接空闲超过一定时间后关闭连接,这可能导致连接池中的连接失效。
- 连接池配置问题:连接池没有正确配置检查空闲连接的机制。
- 网络问题:网络中断或不稳定也可能导致连接被丢弃。
解决方法:
-
启用 MySQL 的
autoReconnect
选项:- 在
jdbcUrl
中添加autoReconnect=true
参数,让 JDBC 自动重新连接。 - 注意:虽然
autoReconnect
可以在一定程度上缓解问题,但不推荐依赖它,因为它可能无法处理所有的连接断开场景。
jdbcUrl=jdbc:mysql://localhost:3306/fish_myplus?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=true&useTimezone=true&serverTimezone=GMT%2B8&autoReconnect=true
- 在
-
配置连接池参数:
- 连接池(例如 HikariCP、Druid)通常会提供配置选项来处理空闲连接。
- 你可以配置连接池定期检查和关闭空闲连接,并在需要时重新获取新的连接。
以 HikariCP 为例,你可以在连接池配置中添加以下参数:
# HikariCP connection pool settings hikari.minimumIdle=5 hikari.maximumPoolSize=10 hikari.idleTimeout=600000 # 连接最大空闲时间, 10 分钟 hikari.maxLifetime=1800000 # 连接最大存活时间, 30 分钟 hikari.connectionTimeout=30000 # 获取连接的最大等待时间, 30 秒 hikari.keepaliveTime=300000 # keepalive, 防止空闲连接被关闭, 5 分钟 hikari.testWhileIdle=true # 检查空闲连接是否有效 hikari.validationTimeout=5000 # 验证连接是否有效的超时时间, 5 秒 hikari.connectionTestQuery=SELECT 1 # 测试 SQL 语句
以 Druid 为例,你可以在连接池配置中添加以下参数:
spring: datasource: druid: initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: true testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 监控数据源设置 filters: stat,wall,log4j
-
调整 MySQL 服务器的超时设置:
- 在 MySQL 配置文件中增加或修改
wait_timeout
和interactive_timeout
参数,延长连接的超时时间。
SET GLOBAL wait_timeout=28800; # 8 小时 SET GLOBAL interactive_timeout=28800;
你可以通过登录 MySQL 客户端并执行以上命令来设置。
- 在 MySQL 配置文件中增加或修改
-
定期发送心跳包:
- 你可以通过在应用程序中定期发送简单的 SQL 查询(如
SELECT 1
)来保持连接活跃,避免超时断开。
- 你可以通过在应用程序中定期发送简单的 SQL 查询(如
最终问题:sql查询的问题,我按照创建时间去进行的排序,而恰好,有很多的创建时间为空,导致sql查询慢,之后按照id去进行排序就可以了。
<select id="selectAllUnionLotto" resultType="com.fish.modeltest.pojo.UnionLottoBean">
select * from union_lotto
order by id
</select>
以下的配置可以查看具体的数据池的资源以及关于慢sql的问题
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin # 监控页面的登录用户名
login-password: admin # 监控页面的登录密码
reset-enable: false
结论:
综上所述,最好的解决方法是结合调整连接池配置和 MySQL 服务器的超时时间,并确保定期检查和刷新连接池中的空闲连接。这将确保你的应用程序在使用数据库连接时更加稳定和可靠。