【发布时间】:2018-03-26 14:57:45
【问题描述】:
我在使用 MySQL 时遇到问题,在插入数万条记录时,我经常收到“数据库连接过多错误”。我正在使用 Python 和 Scrapy 来抓取网页并将信息插入 MySQL。代码如下:
import MySQLdb
# connect to the MySQL server
self.CONN = MySQLdb.connect(host=SQL_HOST,
user=SQL_USER,
passwd=SQL_PASSWD,
db=SQL_DB,
charset='utf8', use_unicode=True)
cursor = self.CONN.cursor()
sql = "INSERT INTO myTable (id, license, address, name, city, state, zip_code, country) \
SELECT uuid(), '" + item['license_num'] + "', '" + item['address'] + "', '" + item['name'] + "', '" + item['city']+ "', '" + item['state'] + "', '" + item['city'] + "', '" + item['state'] + "', '" + item['zip_code'] + "', '" + item['country'] FROM (SELECT 1) t \
WHERE NOT EXISTS (SELECT name FROM myTable WHERE license='" + item['license_num'] + "');"
if cursor.execute(sql):
results = cursor.fetchall()
print results
print 'ADDED BUSINESS: ' + item['name']
print json.dumps(dict(item), indent=4, sort_keys=True)
self.CONN.commit()
cursor.close()
我认为可能是内存问题,但我检查了:
[root@s18573288 ~]# free -m
total used free shared buffers cached
Mem: 4096 1896 2199 106 0 1370
-/+ buffers/cache: 525 3570
Swap: 0 0 0
似乎不是内存问题。我的磁盘空间只有 6% 被使用。我不想重新启动 MySQL,因为它可能会损坏我的数据。如果我让它运行,我希望它会恢复。所以我的问题是如何改进下面的sql以防止连接过多?
【问题讨论】:
-
你在哪里循环吗?
-
是的,每次抓取 Scrapy Item 时都会调用此代码。
-
您是否创建了太多与 mysql 有连接的对象?关闭游标不会关闭与 mysql 的连接。理想情况下,您应该在连接到 mysql 数据库的过程中只有一个对象。如果您在 Linux 下运行该进程,您可以使用“lsof”命令来检查进程中打开的套接字或连接数。
标签: mysql sql python-2.7 scrapy