Seite 1 von 2

Verfasst: Donnerstag 6. September 2007, 18:23
von Costi
vielen dank fuer die detalierte uns hilfreiche antworten

ich werd dan schon jetzt auf postgreSQL umsteigen
und danns gibs hoffentlich keine probleme mehr (-;



.

Verfasst: Donnerstag 6. September 2007, 19:49
von EnTeQuAk
gerold hat geschrieben:Hallo!

Das geht sogar noch einfacher:

Code: Alles auswählen

try:
    conn = cherrypy.thread_data.connection
except NameError:
    conn = cherrypy.thread_data.connection = sqlite3.connect("...")

cur = conn.cursor()
...
Igittt! Das muss ich ja in jeder meiner Dateien schreiben, damit das anstandslos funktioniert. Da finde ich meine Lösung viel magischer und schicker :D
(besonders, da sie auf die "Masse" gerechnet weniger Schreibarbeit erfordert)

@Costi: Du kannst auch MySQL benutzen :D

MfG EnTeQuAk

Verfasst: Donnerstag 6. September 2007, 20:39
von gerold
Hallo EnTeQuAk!
EnTeQuAk hat geschrieben:
gerold hat geschrieben:

Code: Alles auswählen

try:
    conn = cherrypy.thread_data.connection
except NameError:
    conn = cherrypy.thread_data.connection = sqlite3.connect("...")
Da finde ich meine Lösung viel magischer und schicker :D
Na ja, so schlimm finde ich das auch wieder nicht. ;-) Ich habe meist nur ein Modul von dem aus ich auf die Datenbank zugreife. Und dieses Hauptmodul wird sowiso von den meisten anderen Modulen importiert. Ich denke, damit wäre so eine Funktion (wie unten) kein so schlechter Kompromiss.

Code: Alles auswählen

import cherrypy

def get_conn():
    try:
        conn = cherrypy.thread_data.connection
    except NameError:
        conn = cherrypy.thread_data.connection = sqlite3.connect("...")
    return conn

class Root(object):

    def index(self):
        conn = get_conn()
        cur = conn.cursor()
        ...
    index.exposed = True

...
Aber deine Variante, glaube ich, wird vom CherryPy-Team vorgeschlagen. Aber irgendwie finde ich im Moment nichts darüber im CherryPy-Wiki.
EnTeQuAk hat geschrieben:@Costi: Du kannst auch MySQL benutzen :D
@Costi: Du musst aber nicht unbedingt auf EnTeQuAk hören. ;-) :P

lg
Gerold
:-)

Verfasst: Freitag 7. September 2007, 07:16
von Costi
ich find gerolds loesung vie interesanter als ``cherrypy.engine.subscribe`` zu benutzen...


trotzdem werde ich mySQL statt posgreSQL benutzen :lol: :lol:

Verfasst: Freitag 7. September 2007, 11:38
von EnTeQuAk
Na ja, so schlimm finde ich das auch wieder nicht. Ich habe meist nur ein Modul von dem aus ich auf die Datenbank zugreife. Und dieses Hauptmodul wird sowiso von den meisten anderen Modulen importiert. Ich denke, damit wäre so eine Funktion (wie unten) kein so schlechter Kompromiss.
Das habe ich auch. Doch ich bin doch eher der Meinung, bereits funktionierende (und vorgeschlagene) Lösungen vorzuziehen, anstatt eine eigene zu basteln. Es sei denn, die vorhandene ist unbenutzbar oder einfach (wirklich) unschick.

Aber deine Variante, glaube ich, wird vom CherryPy-Team vorgeschlagen. Aber irgendwie finde ich im Moment nichts darüber im CherryPy-Wiki.
Im Wiki nicht, aber ich hatte mal einen Post auf der Mailingliste hier, wo Robert entsprechendes geschrieben hatte.

Costi hat geschrieben:ich find gerolds loesung vie interesanter als ``cherrypy.engine.subscribe`` zu benutzen..
Hast du dafür auch genauere Gründe, wenn man fragen darf?
Costi hat geschrieben: trotzdem werde ich mySQL statt posgreSQL benutzen
@Gerold:
Nicht traurig sein... du schaffst es noch, ein paar Benutzer zu PostgreSQL zu konvertieren :D


MfG EnTeQuAk

Verfasst: Samstag 8. September 2007, 10:02
von apollo13
EnTeQuAk hat geschrieben:
Costi hat geschrieben: trotzdem werde ich mySQL statt posgreSQL benutzen
@Gerold:
Nicht traurig sein... du schaffst es noch, ein paar Benutzer zu PostgreSQL zu konvertieren :D


MfG EnTeQuAk
Ich bin gerade von MySQL auf postgresSQL umgestiegen :)
Und mir kommt so schnell kein MySQL mehr auf die Platte, es sei denn es ist nötig ;)

Verfasst: Samstag 8. September 2007, 10:24
von mitsuhiko
Und wo ist der connection pool?

Verfasst: Samstag 8. September 2007, 14:04
von gerold
blackbird hat geschrieben:Und wo ist der connection pool?
Hallo blackbird!

Diese Frage verstehe ich nicht. 10 Threads -- 10 Connections. Wenn man eine Connection an ``cherrypy.thread_data`` bindet, dann hat man einen Pool von (bei Standardeinstellung) zehn Connections offen. Ich glaube, dass ich damit nicht wirklich falsch liege. Es ist aber auch schon eine Weile her, dass ich mir ein wenig CherryPy-Quellcode angesehen habe.

Oder wie hast du die Frage gemeint?

lg
Gerold
:-)

Verfasst: Samstag 8. September 2007, 14:07
von gerold
apollo13 hat geschrieben:Ich bin gerade von MySQL auf postgresSQL umgestiegen :) Und mir kommt so schnell kein MySQL mehr auf die Platte, es sei denn es ist nötig ;)
Hallo apollo13!

<Geld auf die Hand blätter...> Und hier die versprochenen 10 Euro. Und das Bier geht auf mich. :lol: :wink:

mfg
Gerold
:-)

Verfasst: Samstag 8. September 2007, 23:21
von mitsuhiko
gerold hat geschrieben:
blackbird hat geschrieben:Und wo ist der connection pool?
Hallo blackbird!

Diese Frage verstehe ich nicht. 10 Threads -- 10 Connections. Wenn man eine Connection an ``cherrypy.thread_data`` bindet, dann hat man einen Pool von (bei Standardeinstellung) zehn Connections offen. Ich glaube, dass ich damit nicht wirklich falsch liege. Es ist aber auch schon eine Weile her, dass ich mir ein wenig CherryPy-Quellcode angesehen habe.
Dann hast du einach nur 10 Threads mit 10 Verbindungen. Also MySQL zb öffnet gestorbene Verbindungen nicht automatisch neu. Zumindest wäre mir das neu. Außerdem kannst du dir auf diese weiße nicht zwei Verbindungen in einen Thread holen oder eine Transaktion beenden lassen während der User schon seine Seite bekommen hat.

Verfasst: Sonntag 9. September 2007, 00:08
von gerold
gerold hat geschrieben:@EnTeQuAk: Aber deine Variante, glaube ich, wird vom CherryPy-Team vorgeschlagen. Aber irgendwie finde ich im Moment nichts darüber im CherryPy-Wiki.
Hallo EnTeQuAk!!

Jetzt weiß ich wieder, wo ich etwas über Connections in Threads gelesen hatte:

- http://tools.cherrypy.org/wiki/SQLObjec ... Connection
- http://tools.cherrypy.org/wiki/Databases

mfg
Gerold
:-)

Verfasst: Sonntag 9. September 2007, 00:53
von gerold
Hallo blackbird!
blackbird hat geschrieben:MySQL zb öffnet gestorbene Verbindungen nicht automatisch neu.
Wenn so etwas öfter vor kommt, dann kann man ja etwas dagegen tun:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import psycopg2
import cherrypy

DSN = "dbname='postgres' user='irgendeiner' host='localhost' password='irgendeines'"


def get_conn():
    try:
        conn = cherrypy.thread_data.connection
        # Connection testen
        cur = conn.cursor()
        cur.execute("SELECT CURRENT_TIMESTAMP")
        cur.fetchone()
    except (NameError, psycopg2.ProgrammingError):
        conn = cherrypy.thread_data.connection = psycopg2.connect(DSN)
    
    return conn 

#...
Ich halte diesen Overhead für verschwindend gering. Deshalb hätte ich auch unter Server-Vollast kein Problem damit.
blackbird hat geschrieben:nicht zwei Verbindungen in einen Thread holen
``get_conn1()`` und ``get_conn2()``
Viel mehr, gleichzeitig offene, Verbindungen je Thread werde ich selten benötigen. Man kann es sicher andes lösen, aber sicher nicht einfacher.
blackbird hat geschrieben:eine Transaktion beenden lassen während der User schon seine Seite bekommen hat.
An so einen Fall kann ich mich jetzt nicht erinnern. -- Darüber habe ich noch nicht nachgedacht. Da müsste man wahrscheinlich irgendwie mit einer globalen Datenbankverbindung arbeiten, die dann die Jobs per Queue bekommt. So z.B.: http://aspn.activestate.com/ASPN/Cookbo ... ipe/496799

lg
Gerold
:-)