J'ai des problèmes avec MySQL car je reçois constamment une "base de données avec trop d'erreurs de connexion" lors de l'insertion de dizaines de milliers d'enregistrements. J'utilise Python et Scrapy pour gratter les pages Web et insérer les informations dans MySQL. Voici le code:Prévenir trop de connexions dans MySQL lors de l'insertion de dizaines de milliers d'enregistrements
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()
Je pense qu'il pourrait y avoir des problèmes de mémoire, mais j'ai vérifié:
[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 4096 1896 2199 106 0 1370
-/+ buffers/cache: 525 3570
Swap: 0 0 0
ne semble pas être un problème de mémoire. Seulement 6% de mon espace disque est utilisé. Je ne veux pas redémarrer MySQL car cela pourrait corrompre mes données. J'espère qu'il récupérera si je le laisse courir. Donc, ma question est de savoir comment améliorer le sql ci-dessous pour éviter trop de connexions?
Vous faites une boucle partout? –
Oui, chaque fois qu'un article Scrapy est gratté, ce code est appelé. – MoreScratch
Créez-vous trop d'objets qui ont une connexion à mysql? la fermeture du curseur ne fermera pas la connexion à mysql. Idéalement, vous devriez avoir un seul objet dans le processus pour vous connecter à la base de données mysql. Si vous exécutez le processus sous Linux, vous pouvez utiliser les commandes "lsof" pour vérifier le nombre de sockets ouvertes ou de connexions du processus. –