几乎 10 个树莓派使用下面提到的相同脚本,并尝试每分钟(几乎同时(将数据发送到数据库。
当只有一个设备与数据库通信时几乎没有问题,但当我开始添加更多树莓派时,问题就开始了。
Code:
import pyodbc
def update_database():
try:
mydb = pyodbc.connect('DRIVER=FreeTDS;SERVER=192.xxx.xxx.xxx;PORT=xxxx;DATABASE=xxxxxxx;UID=xxxxxxx;PWD=xxxxxxx;TDS_Version=4.2;')
mycursor = mydb.cursor()
if mycursor.tables(table='DBDBDBDB', tableType='TABLE').fetchone():
print("DB exists")
else:
print("DB absent")
DB_Connection_status=0
ycursor = mydb.cursor()
sql = "INSERT INTO DBDBDBDB (docdt, timestamp, cocd, param1, param2, param3, param4, param5, param6, param7, param8)
VALUES (?,?,?,?,?,?,?,?,?,?,?)"
DB_Connection_status=1
systemlog("DB Connected")
except:
DB_Connection_status=0
print ("Connection with database: failed")
systemlog("DB Not Connected")
for index_y in range (0,6):
#few lines of code here
for index_x in range (0,60):
#few lines of code here
if(DB_Connection_status==1):
val = (formatted_date, formatted_time, COCD, str(var1),
str(var2), str(var3),
'A','1', str( var4[index_y][index_x]),
str(var5[index_y][toggle_sw_num-1]),0)
try:
mycursor.execute(sql, val)
except:
systemlog("DB record skipped")
if(DB_Connection_status==1):
try:
mydb.commit()
print(mycursor.rowcount, "record inserted.")
systemlog("Record inserted")
except:
systemlog("DB commit skipped")
while 1:
#few lines of code here
if(system_minute!=oldsystem_minute):
oldsystem_minute=system_minute
#few lines of code here
update_database()
最初它抛出错误,如下所示,然后我为游标执行和提交添加了错误处理
Traceback (most recent call last):
File "mod.py", line 461, in <module>
File "mod.py", line 213, in update_database
pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL Server]Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. (1205) (SQLExecDirectW)')
但此错误处理只是为了避免代码崩溃。
代码序列有任何问题吗?例如,我应该每次在游标执行时调用提交/关闭吗? 对此有任何帮助吗?
操作系统:在树莓派上运行的树莓, 蟒蛇:2.7, DB: MSSQL
谢谢
我应该每次在游标执行时调用提交/关闭吗?
是的。commit()
. 插入的行和索引上的锁在事务期间保持。commit()
将释放该会话的所有锁。
如果在每行之后提交是性能问题,则可以打开延迟持久性,或者,而不是具有单行插入的嵌套循环,构建包含所有 360 行的 JSON 文档,将其发送到 SQL Server,并让 SQL Server 解析并将其插入到单个语句中。