2017-10-14 1 views
0

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?

+0

Vous faites une boucle partout? –

+0

Oui, chaque fois qu'un article Scrapy est gratté, ce code est appelé. – MoreScratch

+1

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. –

Répondre

0

vous devez vous assurer que le curseur est fermé chaque fois que vous appelez le code. ce code peut aider

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'] + "'); 
""" 

try: 
    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() 
except Exception as e: 
    print str(e) 
finally: 
    cursor.close() 
+0

Bon, alors quand je l'implémente comme vous le suggérez, j'ai "Les commandes sont désynchronisées; vous ne pouvez pas exécuter cette commande maintenant "(2014) exception – MoreScratch

+0

Dois-je ouvrir une nouvelle connexion pour chaque insertion? – MoreScratch

0

essayer de fermer la connexion MySQL à la fin du script

finally: 
    cursor.close() 
    self.CONN.close() # close connection