2017-03-06 91 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