Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: 修复数据库选主实现类在时间跨度大于35天时 SQL 报错的问题 #155

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

HasonHuang
Copy link
Contributor

问题

使用数据库选主,当历史心跳记录距今大于 3020399 秒,删除这些过期心跳记录时会报错。

详细日志:

2020-07-14 22:02:50.491 ERROR 7036 --- [pool-3-thread-1] c.y.e.e.i.d.DatabaseMasterSelectorImpl   : heart beat failed!38

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [delete from trx_election where app_id = ? and TIME_TO_SEC(TIMEDIFF(NOW(), heart_beat_time)) > ?]; Data truncation: Truncated incorrect time value: '1797:03:18'; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect time value: '1797:03:18'
	at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:102)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:655)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:937)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:947)
	at com.yiqiniu.easytrans.extensionsuite.impl.database.DatabaseMasterSelectorImpl.updateHeartBeat(DatabaseMasterSelectorImpl.java:84)
	at com.yiqiniu.easytrans.extensionsuite.impl.database.DatabaseMasterSelectorImpl.access$0(DatabaseMasterSelectorImpl.java:72)
	at com.yiqiniu.easytrans.extensionsuite.impl.database.DatabaseMasterSelectorImpl$1.run(DatabaseMasterSelectorImpl.java:67)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect time value: '1797:03:18'
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3931)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1912)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2133)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2067)
	at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5175)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2052)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:256)
	at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:883)
	at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:876)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:639)
	... 13 common frames omitted

环境

版本:1.4.3

原因

MySQL 文档 - TIMEDIFF 描述了 TIMEDIFF 的范围是 '-838:59:59' - '838:59:59'。因此,当时间差大于约35天时,DML 语句报错。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant