2017-03-06 89 views
0

我運行了循環,並在每個循環中集中查詢了大量數據。 我的數據庫是使用Crate構建的。 有時候,由於Crate沒有迴應我的查詢結果,所以循環暫停。 (這並不總是發生,雖然)的僞代碼如下查詢箱子時卡住

from crate import client 

class data_access(object): 
    def __init__(self, IP): 
     conn = client.connect(IP) 
     self.cursor = conn.cursor() 

    def get_report(self, event_id): 
     self.cursor.execute(''' 
      select schema.events."Info", schema.events."Time" 
      from schema.events 
      where schema.events."Id"='%s' ''' % event_id) 

     event = [] 
     for row in self.cursor: 
      event.append((row[0], row[1])) 

     return event 


dal = data_access("server IP") 
all_events = [] 
for event_id in event_ids: 
    events = dal.get_report(event_id) 
    if len(events) >0: all_event += events 

event_ids長度可能是數以百萬計,並在每個循環中的查詢是密集。任何使用Crate的DB專家都會遇到這個問題嗎?如果是的話,你是如何解決這個問題的?似乎重新啓動數據庫不起作用。大量的解決方案謝謝!

+0

您是否知道您的查詢是開放的SQL注射攻擊? – alroc

+0

@alroc:我不是。什麼是SQL注入攻擊?謝謝! – Hsiang

回答

1

我無法重現這一點,但我懷疑它可能是由您每次在循環內創建連接的原因造成的。而不是重新創建的連接數百萬次,我想改寫這個來創建連接一次,外循環,然後把它傳遞到get_report,如:

from crate import client 

def get_report(event_id, conn): 
    cursor = conn.cursor() 
    cursor.execute(''' 
     select schema.events."Info", schema.events."Time" 
     from schema.events 
     where schema.events."Id"='%s' ''' % event_id) 

    event = [] 
    for row in cursor: 
     event.append((row[0], row[1])) 

    return event 


all_events = [] 
conn = client.connect("server IP") 
for event_id in event_ids: 
    events = get_report(event_id, conn) 
    if len(events) >0: all_event += events 
+0

非常感謝您的解決方案!但實際上我們建立了一個類,只調用一次連接。我用更準確的代碼重新編輯了這篇文章。謝謝。 – Hsiang