title: Twisted web service - sql connection drops
body: <p>I am working on a web service with Twisted that is responsible for calling up several packages I had previously used on the command line.  The routines these packages handle were being prototyped on their own but now are ready to be integrated into our webservice.</p>
  
  <p>In short, I have several different modules that all create a mysql connection property internally in their original command line forms.  Take this for example:</p>
  
  <pre><code>class searcher:
    def __init__(self,lat,lon,radius):
      self.conn = getConnection()[1]
      self.con=self.conn.cursor();
  
      self.mgo = getConnection(True)
  
      self.lat = lat
      self.lon = lon
      self.radius = radius
      self.profsinrange()
      self.cache = memcache.Client(["173.220.194.84:11211"])
  </code></pre>
  
  <p>The getConnection function is just a helper that returns a mongo or mysql cursor respectively.  Again, this is all prototypical :)</p>
  
  <p>The problem I am experiencing is when implemented as a consistently running server using Twisted's WSGI resource, the sql connection created in init times out, and subsequent requests don't seem to regenerate it.  Example code for small server app:</p>
  
  <pre><code>from twisted.web import server
  from twisted.web.wsgi import WSGIResource
  from twisted.python.threadpool import ThreadPool
  from twisted.internet import reactor
  from twisted.application import service, strports
  import cgi
  
  import gnengine
  import nn
  
  wsgiThreadPool = ThreadPool()
  wsgiThreadPool.start()
  
  # ensuring that it will be stopped when the reactor shuts down
  reactor.addSystemEventTrigger('after', 'shutdown', wsgiThreadPool.stop)
  
  
  def application(environ, start_response):
      start_response('200 OK', [('Content-type','text/plain')])
      params = cgi.parse_qs(environ['QUERY_STRING'])
      try:
        lat =  float(params['lat'][0])
        lon = float(params['lon'][0])
        radius = int(params['radius'][0])
        query_terms = params['query']
        s = gnengine.searcher(lat,lon,radius)
        query_terms = ' '.join( query_terms )
        json = s.query(query_terms)
        return [json]
      except Exception, e:
        return [str(e),str(params)]
  
      return ['error']
  
  wsgiAppAsResource = WSGIResource(reactor, wsgiThreadPool, application)
  
  # Hooks for twistd
  application = service.Application('Twisted.web.wsgi Hello World Example')
  server = strports.service('tcp:8080', server.Site(wsgiAppAsResource))
  server.setServiceParent(application)
  </code></pre>
  
  <p>The first few requests work fine, but after mysqls <code>wait_timeout</code> expires, the dread error 2006 "Mysql has gone away" error surfaces.  It had been my understanding that every request to the WSGI Twisted resource would run the application function, thereby regenerating the searcher object and re-leasing the connection.  If this isn't the case, how can I make the requests processed as such?  Is this kind of Twisted deployment not transactional in this sense?  Thanks!</p>
  
  <p><strong>EDIT</strong>:  Per request, here is the prototype helper function calling up the connection:</p>
  
  <pre><code>def getConnection(mong = False):
      if mong == False:
      connection = mysql.connect(host = db_host,
                     user = db_user,
                     passwd = db_pass,
                     db = db,
                     cursorclass=mysql.cursors.DictCursor)
      cur = connection.cursor();
      return (cur,connection)
      else:
      return pymongo.Connection('173.220.194.84',27017).gonation_test
  </code></pre>