- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的公司创建一个产品,用于跟踪带有 RFID 标签的元素,他们在信息亭刷卡,它会记录在数据库中,很简单。
数据库实际上托管在信息亭上(我知道这不是最佳实践),并且信息亭上运行的主程序是带有 GuiZero 的 python 前端。该信息亭在 Raspberry Pi 上运行 Raspbian Desktop。
一切运行良好,但在程序启动后(大约)24 小时,它会像平常一样运行,直到数据库查询发送到服务器。 python-mariadb-connector 响应:2055: Lost connection to MySQL server at '127.0.0.1:3306', system error: 32 Broken pipeline
,我已经对此进行了大约一个月的故障排除我现在知道什么可以解决这个问题。
每当发生这种情况时,我都尝试简单地从 python 前端内部更新连接,但这也不起作用。解决该问题的唯一方法是重新启动程序,但不能相信用户会知道该怎么做。
需要注意的一点是,一切都完美运行,直到到达大约 24 小时标记。
有什么帮助吗?
依赖关系:
Python 3.7
(pip) mysql-connector v2.2.9
MariaDB: 10.3.17-MariaDB-0+deb10ul Raspbian 10
Raspbian GNU/Linux v10
超时变量
MariaDB [locker]> show variables like "%timeout";
+---------------------------------------+-------+
| Variable_name | Value |
+---------------------------------------+-------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| idle_readonly_transaction_timeout | 0 |
| idle_transaction_timeout | 0 |
| idle_write_transaction_timeout | 0 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 86400 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_slave_kill_conn_timeout | 5 |
| slave_net_timeout | 60 |
| thread_pool_idle_timeout | 60 |
| wait_timeout | 28800 |
+---------------------------------------+-------+
这是代码,第 166 行是处理错误的地方。 (并不是说我的处理有任何作用)Ctrl+F 表示“aghiulg”到达该行。
#!/usr/bin/python3.7
from datetime import datetime
from sys import exit
# Classes
class User:
def __init__ (self, rfid, name):
self.name = name
self.rfid = rfid
class Key:
def __init__ (self, rfid, kid, prop, loc):
self.rfid = rfid
self.kid = kid
self.prop = prop.split("/")
self.loc = loc
def toString (self):
return "[{}] {}".format(self.kid, "/".join(self.prop[:3]))
# Slack
import slack
slackBotToken = "OBFUSCATEDFORSTACKOVERFLOW"
slackClient = slack.WebClient(slackBotToken)
slackID = None
def getTimeString ():
now = datetime.now()
return now.strftime("%m/%d/%Y %H:%M:%S")
def log (s):
time = getTimeString()
# stdout
print("[{}] {}".format(time, s))
# slack
slackErr = False
try:
slackClient.chat_postMessage(channel = "#keys", text = s)
except concurrent.futures._base.TimeoutError:
slackErr = True
# file
with open("/home/pi/key-locker/log.txt", "a+") as f:
f.write("[{}] {}\n".format(time, s))
if slackErr:
f.write("Couldn't write that to Slack, oops.")
def xlog (s):
try:
slackClient.chat_postMessage(channel = "OBFUSCATED", text = s)
return True
except concurrent.futures._base.TimeoutError:
return False
# guizero
from guizero import App, Text, TextBox, info
app = App(title = "Key Locker")
app.tk.attributes("-fullscreen", True)
REFOCUS_TIMER = 500
USER_TIMEOUT = 60 * 1000
# MariaDB
import mysql.connector as mariadb
def connectDB ():
xlog("Reconnecting to database...")
return mariadb.connect(user="OBFUSCATED", password="OBFUSCATED", database="OBFUSCATED")
# mdb = mariadb.connect(user="OBFUSCATED", password="OBFUSCATED", database="OBFUSCATED")
mdb = connectDB()
cursor = mdb.cursor(buffered = True)
def focusUIN (uin = None):
if uin:
uin.focus()
def onTextBoxKey (e, f = None):
global uidBox, kidBox, bigText, underText, currentUser, currentKey, escapeKeys
if len(e.key) == 0:
return
if f == uidBox and ord(e.key) == 13:
uid = uidBox.value
if uid.lower() in escapeKeys:
exit(0)
else:
currentUser = codeToUser(uid)
if currentUser:
uidBox.cancel(focusUIN)
uidBox.disable()
kidBox.enable()
kidBox.repeat(REFOCUS_TIMER, focusUIN, args = [kidBox])
kidBox.when_key_pressed = lambda e: onTextBoxKey(e, f = kidBox)
bigText.value = "Scan Key"
underText.value = "Welcome, {}.".format(currentUser.name)
app.after(USER_TIMEOUT, restart, args = ["User Timeout"])
else:
restart("That user doesn't exist.")
elif f == kidBox and ord(e.key) == 13:
kid = kidBox.value
if kid.lower() in escapeKeys:
exit(0)
else:
app.cancel(restart)
currentKey = codeToKey(kid)
if currentKey:
kidBox.cancel(focusUIN)
kidBox.disable()
inLocker = (currentKey.loc.lower() == "locker")
success = (checkout(currentUser, currentKey) if inLocker else checkin(currentUser, currentKey))
if success:
restart("{} checked {} the {} keys.".format(currentUser.name, "out" if inLocker else "in", currentKey.toString()))
else:
restart("System error, try again.")
else:
restart("That key doesn't exist.")
def restart (subText = ". . ."):
global uidBox, kidBox, bigText, underText
uidBox.value = ""
uidBox.enable()
uidBox.cancel(focusUIN)
uidBox.repeat(REFOCUS_TIMER, focusUIN, args = [uidBox])
uidBox.focus()
kidBox.value = ""
kidBox.cancel(focusUIN)
kidBox.disable()
bigText.value = "Scan Badge"
underText.value = subText
# App
escapeKeys = "letmeout pleaseijustwanttoseemywifeandkidsagain".split(" ")
currentUser = None
currentKey = None
def codeToUser (uid = None):
xlog("Trying to find user by RFID...")
if uid:
try:
cursor.execute("select Name from user where RFID = '{}';".format(uid))
names = []
for n in cursor:
names.append(n)
if len(names) != 1:
xlog("Ran the function, and literally got no matches for that user rfid.")
xlog("Restarting...")
exit(0)
return None
else:
xlog("Found user: {}".format(names[0][0]))
return User(uid, names[0][0])
except mariadb.Error as e: # aghiulg
xlog("Database error trying to find the user.\n{}".format(e))
# fatalError(e)
return None
else:
xlog("They didn't give me an RFID.")
return None
def codeToKey (kid = None):
if kid:
try:
cursor.execute("select KeyringID, Properties, Location from keyring where RFID = {};".format(kid))
keys = []
for k in cursor:
keys.append(k)
if len(keys) != 1:
return None
else:
keys = keys[0]
return Key(kid, keys[0], keys[1], keys[2])
except mariadb.Error as e:
# fatalError(e)
return None
else:
return None
def checkout(user, key):
global mdb
log("Checking out k{} ({}) to {}.".format(key.kid, ", ".join(key.prop), user.name))
try:
cursor.execute("update keyring set Location = '{}' where KeyringID = {}".format(user.name, key.kid))
mdb.commit()
return True
except mariadb.Error as e:
# fatalError(e)
mdb = connectDB()
return False
def checkin (user, key):
global mdb
log("Checking in k{} ({}) from {}.".format(key.kid, ", ".join(key.prop), user.name))
try:
cursor.execute("update keyring set Location = 'locker' where KeyringID = {}".format(key.kid))
mdb.commit()
return True
except mariadb.Error as e:
# fatalError(e)
mdb = connectDB()
return False
def fatalError (e):
log("Error: {}".format(e))
log("Fatal error encountered, Key Locker turning off. Next user must open it by double clicking the desktop link.")
exit()
# First Run
if __name__ == "__main__":
bigText = Text(app, "Scan Badge", size = 40, color = "black")
underText = Text(app, ". . .", size = 15, color = "black")
uidBox = TextBox(app)
uidBox.repeat(REFOCUS_TIMER, focusUIN, args = [uidBox])
uidBox.when_key_pressed = lambda e: onTextBoxKey(e, f = uidBox)
kidBox = TextBox(app, enabled = False)
auditText = Text(app, size = 10, color = "black")
app.display()
最佳答案
interactive_timeout 的默认值为 28800 秒 = 8 小时,这意味着 8 小时不活动后,服务器将自动关闭连接。
我会尝试增加此值并检查断开连接是否仍然发生。
根据 PEP-249,一旦连接句柄变得无效,所有游标对象都会变得无效。由于 MySQL Connector/Python 没有自动重新连接选项,并且不允许将连接对象重新分配给游标,因此您必须在重新使用游标之前重新创建游标。
关于Python 与 MariaDB 服务器的连接大约每 24 小时关闭一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59788696/
我知道这个问题可能已经被问过,但我检查了所有这些,我认为我的情况有所不同(请友善)。所以我有两个数据集,第一个是测试数据集,第二个是我保存在数据框中的预测(预测值,这就是没有数据列的原因)。我想合并两
在 .loc 方法的帮助下,我根据同一数据框中另一列中的值来识别 Panda 数据框中某一列中的值。 下面给出了代码片段供您引用: var1 = output_df['Player'].loc[out
当我在 Windows 中使用 WinSCP 通过 Ubuntu 连接到 VMware 时,它提示: The server rejected SFTP connection, but it lis
我正在开发一个使用 xml web 服务的 android 应用程序。在 wi-fi 网络中连接时工作正常,但在 3G 网络中连接时失败(未找到 http 404)。 这不仅仅发生在设备中。为了进行测
我有一个XIB包含我的控件的文件,加载到 Interface Builder(Snow Leopard 上的 Xcode 4.0.2)中。 文件的所有者被设置为 someClassController
我在本地计算机上管理 MySQL 数据库,并通过运行以下程序通过 C 连接到它: #include #include #include int main(int argc, char** arg
我不知道为什么每次有人访问我网站上的页面时,都会打开一个与数据库的新连接。最终我到达了大约 300 并收到错误并且页面不再加载。我认为它应该工作的方式是,我将 maxIdle 设置为 30,这意味着
希望清理 NMEA GPS 中的 .txt 文件。我当前的代码如下。 deletes = ['$GPGGA', '$GPGSA', '$GPGSV', '$PSRF156', ] searchquer
我有一个 URL、一个用户名和一个密码。我想在 C# .Net WinForms 中建立 VPN 连接。 你能告诉我从哪里开始吗?任何第三方 API? 代码示例将受到高度赞赏... 最佳答案 您可以像
有没有更好的方法将字符串 vector 转换为字符 vector ,字符串之间的终止符为零。 因此,如果我有一个包含以下字符串的 vector "test","my","string",那么我想接收一
我正在编写一个库,它不断检查 android 设备的连接,并在设备连接、断开连接或互联网连接变慢时给出回调。 https://github.com/muddassir235/connection_ch
我的操作系统:Centos 7 + CLOUDLINUX 7.7当我尝试从服务器登录Mysql时 [root@server3 ~]# Mysql -u root -h localhost -P 330
我收到错误:Puma 发现此错误:无法打开到本地主机的 TCP 连接:9200(连接被拒绝 - 连接(2)用于“本地主机”端口 9200)(Faraday::ConnectionFailed)在我的
请给我一些解决以下错误的方法。 这是一个聊天应用....代码和错误如下:: conversations_controller.rb def create if Conversation.bet
我想将两个单元格中的数据连接到一个单元格中。我还想只组合那些具有相同 ID 的单元格。 任务 ID 名称 4355.2 参与者 4355.2 领袖 4462.1 在线 4462.1 快速 4597.1
我经常需要连接 TSQL 中的字段... 使用“+”运算符时 TSQL 强制您处理的两个问题是 Data Type Precedence和 NULL 值。 使用数据类型优先级,问题是转换错误。 1)
有没有在 iPad 或 iPhone 应用程序中使用 Facebook 连接。 这个想法是登录这个应用程序,然后能够看到我的哪些 facebook 用户也在使用该应用程序及其功能。 最佳答案 是的。
我在连接或打印字符串时遇到了一个奇怪的问题。我有一个 char * ,可以将其设置为字符串文字的几个值之一。 char *myStrLiteral = NULL; ... if(blah) myS
对于以下数据 - let $x := "Yahooooo !!!! Select one number - " let $y := 1 2 3 4 5 6 7 我想得到
我正在看 UDEMY for perl 的培训视频,但是视频不清晰,看起来有错误。 培训展示了如何使用以下示例连接 2 个字符串: #!usr/bin/perl print $str = "Hi";
我是一名优秀的程序员,十分优秀!