[Twisted-Python] db connections

Rob Hoadley hoadley at gmail.com
Tue Mar 24 13:26:35 MDT 2009


Sorry I apologize... that email I wrote wasn't very clear.

I've done it in the factory like below.  Slightly different from
Alvin.   I've used the factory __init__ to pass on the logical_db
information... then I have a dbpool created later.  That way I can do
development and production based on ENV vars.  The db.return_kwargs
function just returns the appropriate environment args.  I was also
mentioning the reconnection functionality which by default is turned
off.    Just make sure you handle ConnectionLost exceptions.  Also in
the stopFactory I shutdown the dbpool by closing it.

You'll also notice the openFun... which i use to set the displayed
host name and app name.  But this is db vendor specific.

def __init__(self, baseDir, validDomains, logical_db, app_name ):
        ''' factory init '''
        self.baseDir = baseDir
        self.validDomains = validDomains
        self.logical_db = logical_db
        self.app_name = app_name

def startFactory(self):
    ''' In startFactory start up the dbpool '''

    self.db = db( self.logical_db, self.app_name )
    db_kwargs = self.db.return_kwargs()

    #set the delay_connect and
    #twisted cp_openfun callable
    db_kwargs['delay_connect'] = 1
    db_kwargs['cp_openfun']  = self.db._dbOptions
    db_kwargs['cp_min'] = 1  # one thread min
    db_kwargs['cp_max'] = 1  # one thread max  = only one db connection
    db_kwargs['cp_reconnect'] = 1  # reconnect if die
    db_kwargs['cp_noisy'] =  1

    #print out the db_kwargs
    print ",".join( ["%s=%s" % (k, v) for k, v in db_kwargs.items()] )

    self.dbpool =
adbapi.ConnectionPool(self.db.return_import_name(),**db_kwargs)

On Tue, Mar 24, 2009 at 10:10 AM, Alvin Delagon <adelagon at gmail.com> wrote:
> Something like this:
>
> from twisted.protocols import basic
> from twisted.internet import protocol, reactor
> from twisted.enterprise import adbapi
>
> class MyProtocol(basic.LineReceiver):
>     def __init__(self):
>         pass
>
>     def lineReceived(self, line):
>         ### dbcon can be accessed via self.factory
>         print dir(self.factory.dbcon)
>
> class MyFactory(protocol.ServerFactory):
>     protocol = MyProtocol
>     def __init__(self):
>         self.dbcon = adbapi.ConnectionPool("pyPgSQL.PgSQL", database="data",
> user='pet', host='local', password='some')
>
> if __name__ == "__main__":
>     reactor.listenTCP(8080, MyFactory())
>     reactor.run()
>
> I usually put persistent data on the factory so that protocol instances can
> access them such as {username:<protocol instance>} dictionary for chatroom
> server.
>
>
>
> On Wed, Mar 25, 2009 at 12:22 AM, Pet <petshmidt at googlemail.com> wrote:
>>
>> On Tue, Mar 24, 2009 at 5:04 PM, Rob Hoadley <hoadley at gmail.com> wrote:
>> > You'd want to use a connection pool to manage the db interaction.
>> > Your server is pretty unusable after a db connection failure.  I've
>> > used the connection pool before with a cp_min of 1 and a cp_max of 2.
>>
>> Honestly speaking, I don't understand, what does it mean.
>> I'm already using connection pool with default cp_min an max, don't I?
>> Could you explain me, as for a newbie, please
>>
>> >
>> >
>> > http://twistedmatrix.com/documents/8.2.0/api/twisted.enterprise.adbapi.ConnectionPool.html
>> >
>> >
>> > On Tue, Mar 24, 2009 at 6:45 AM, Alvin Delagon <adelagon at gmail.com>
>> > wrote:
>> >> Put self.dbcon in the MyFactory class. MyProtocol instances can access
>> >> it
>> >> via self.factory.
>> >>
>> >>
>> >> On Tue, Mar 24, 2009 at 6:10 PM, Pet <petshmidt at googlemail.com> wrote:
>> >>>
>> >>> Hi,
>> >>>
>> >>> I've wrote an daemon which does some queries to db and sends response
>> >>> back to client. Do I need to make for every request from client (new
>> >>> instance of  MyProtocol) a new connection to DB? Or can I somehow
>> >>> prepare connection, so I could save some time? Maybe make connection
>> >>> in Factory and pass it to Protocol? But what happens if too much
>> >>> clients are connected to server? What is the way to control it?
>> >>>
>> >>> Regards, Pet
>> >>>
>> >>>
>> >>> class MyProtocol(basic.LineReceiver):
>> >>>
>> >>>    def __init__(self):
>> >>>        print "new connection"
>> >>>        self.dbcon = adbapi.ConnectionPool("pyPgSQL.PgSQL",
>> >>> database="data", user='pet', host='local', password='some')
>> >>>
>> >>>
>> >>> class MyFactory(protocol.ServerFactory):
>> >>>    protocol = MyProtocol
>> >>>
>> >>> class MyService(internet.TCPServer):
>> >>>    def __init__(self):
>> >>>        internet.TCPServer.__init__(self,PORT,MyFactory())
>> >>>
>> >>> def main():
>> >>>    reactor.listenTCP(PORT, MyFactory())
>> >>>    reactor.run()
>> >>>
>> >>>
>> >>> if __name__ == '__main__':
>> >>>    main()
>> >>>
>> >>> _______________________________________________
>> >>> Twisted-Python mailing list
>> >>> Twisted-Python at twistedmatrix.com
>> >>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>> >>
>> >>
>> >>
>> >> --
>> >> http://www.alvinatorsplayground.blogspot.com/
>> >>
>> >> _______________________________________________
>> >> Twisted-Python mailing list
>> >> Twisted-Python at twistedmatrix.com
>> >> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>> >>
>> >>
>> >
>> > _______________________________________________
>> > Twisted-Python mailing list
>> > Twisted-Python at twistedmatrix.com
>> > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>> >
>>
>> _______________________________________________
>> Twisted-Python mailing list
>> Twisted-Python at twistedmatrix.com
>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>
>
> --
> http://www.alvinatorsplayground.blogspot.com/
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>




More information about the Twisted-Python mailing list