0

有带有 Asterisk PBX 11.25.3 和 mysql Ver 15.1 Distrib 10.3.18-MariaDB 的 Centos 7 服务器,适用于 Linux (x86_64)。

extensions.conf:

[from-main-asterisk]
exten => _9XXXXXXXXXXXX,1,MYSQL(Connect connid localhost root rootpasswd mydatabase)
exten => _9XXXXXXXXXXXX,n,GotoIf($["${connid}" = ""]?error,1)
exten => _9XXXXXXXXXXXX,n(select_sim),MYSQL(Query RESULTID ${connid} set autocommit=0)
exten => _9XXXXXXXXXXXX,n,MYSQL(Query RESULTID ${connid} START TRANSACTION)
exten => _9XXXXXXXXXXXX,n,MYSQL(Query RESULTID ${connid} SELECT sim_name FROM  sim_stat  where status = 'FREE'  order by rand() limit 1 ) 
exten => _9XXXXXXXXXXXX,n(sqlresult),MYSQL(Fetch fetchid ${RESULTID} SIM_NAME)
exten => _9XXXXXXXXXXXX,n,MYSQL(Clear ${RESULTID})
exten => _9XXXXXXXXXXXX,n,MYSQL(Query RESULTID ${connid} UPDATE sim_stat set status = "BUSY" where sim_name = "${SIM_NAME}") 
exten => _9XXXXXXXXXXXX,n,MYSQL(Query RESULTID ${connid} COMMIT)
exten => _9XXXXXXXXXXXX,n,Dial(SIP/gsm-${SIM_NAME}#${EXTEN:1},,g)
exten => _9XXXXXXXXXXXX,n,Hangup

exten => h,1,MYSQL(Query RESULTID ${connid} UPDATE sim_stat set status = "FREE"  where sim_name = "${SIM_NAME}")
exten => h,n,MYSQL(Query RESULTID ${connid} COMMIT)
exten => h,n,MYSQL(Disconnect ${connid})

exten => error,1,NoOp(Database connection error!)
exten => error,n,Hangup

sip.conf:

[from-main-asterisk]
type=friend
host=x.x.x.x
qualify=yes
qualifyfreq=60
canreinvite=no
disallow=all
allow=alaw
context=from-main-asterisk

当来自中继的同时呼叫超过 15-20 个时,我收到消息:

WARNING[2239][C-00000389] app_mysql.c: aMYSQL_query: mysql_query failed. Error: Lock wait timeout exceeded; try restarting transaction

MariaDB 中的并发事务有限制吗?

4

2 回答 2

0
  1. 使用 func_odbc,它可以正确处理连接
  2. 按 rand() 排序总是扫描整个表
  3. 如果您的表类型为 myisam,则任何对表的扫描都会锁定整个表。
于 2019-10-10T09:20:49.370 回答
0

交易数量限制在 96K 左右。见https://mariadb.com/kb/en/library/innodb-limitations/

INDEX(status, sim_name)(按此顺序)可能会加快您交易中的冗长查询。

或者,您可以ORDER BY rand()通过使用此处的一种技术来避免所需的表扫描:http: //mysql.rjweb.org/doc.php/random

另一种方法涉及重新设计您的应用程序以获取例如 10 个随机 sim_name,将它们标记为您的进程正在使用,然后退出事务。然后处理它们,最后在其他事务中释放它们。

这种标记和释放方法属于包含操作的事务的一部分——当操作需要很长时间时,这尤其有用。

抓 10 和抓 1 一样快;因此,这给了你速度。

于 2019-10-17T01:34:14.383 回答