我正在实现一个代码,在这个代码中,我需要以固定的时间间隔执行一些操作。
其中很少涉及从mysql数据库获取数据。
为了以固定的时间间隔安排这些操作,我使用了gocron。它工作得很好。
对于数据库,从现在开始,我在主程序的开头创建一个示例,并将其传递给子例程。我在用https://github.com/jmoiron/sqlx 与db合作。
代码流程是:
初始化资源。例如db=sql.open;将db放入公共结构中,以传递给所有子例程
ii-使用gocron的scheduleactions(根据需要传递资源)
动作是使用给定资源(例如db)根据需要执行任务的特定子例程
我有几个例子需要重新启动mysql服务。
然后,正如预期的那样,我得到一个错误,指出无效的连接。像这样的事情
[mysql] packets.go:33: unexpected EOF
[mysql] packets.go:130: write tcp 127.0.0.1:36191->127.0.0.1:3306: write: broken pipe
[mysql] connection.go:312: invalid connection
为了解决这个问题,我做了一个实现来获取子例程中的db连接,并用defer db.close()关闭。有了这个,我得到的错误与太多的开放连接。我已经检查了正确的行关闭,以及使用扫描。看看这些建议是否得到了遵循。
我想了解如何在我的情况下进行db打开和关闭处理。
1条答案
按热度按时间jrcvhitl1#
你可以用
sync.Once
为了防止这种情况:请阅读以下内容:https://aaronoellis.com/articles/preventing-max-connection-errors-in-go