JSF Datenbank Probleme (Limit, Wiederholung)

purzel

Bekanntes Mitglied
Hallo,

ich haber derzeit merkwürdige massive Datenbank Probleme!

Wenn ich aus der Datenbank einen Datensatz auslesen will, wird der mir in der Konsole gleich mehrfach! (3 - 7 mal) hintereinander ausgegeben.

Hier ein Beispiel:

SQL:
DATABASE SELECT: com.mysql.jdbc.PreparedStatement@10db5b3f: SELECT sessionid, username, last_activity, site, ip FROM online_users LIMIT 0, 1
DATABASE SELECT: com.mysql.jdbc.PreparedStatement@73e2bda7: SELECT sessionid, username, last_activity, site, ip FROM online_users LIMIT 0, 1
DATABASE SELECT: com.mysql.jdbc.PreparedStatement@6366ce5f: SELECT sessionid, username, last_activity, site, ip FROM online_users LIMIT 0, 1
DATABASE SELECT: com.mysql.jdbc.PreparedStatement@144683c2: SELECT sessionid, username, last_activity, site, ip FROM online_users LIMIT 0, 1
DATABASE SELECT: com.mysql.jdbc.PreparedStatement@5f14a3c6: SELECT sessionid, username, last_activity, site, ip FROM online_users LIMIT 0, 1

Desweiteren kann ich nur einen Datensatz ahzeigen, also wenn ich z.B.
Code:
LIMIT 0, 1
habe, kommt der Datensatz. Bei
Code:
LIMIT 1, 1
kommt nichts mehr! :( In dem Verwaltungsprogramm der Datenbank (MySQL) wird der eintsprechende Datensatz angezeigt. Es kann also nur an meinem Code liegen! Wer kann mir helfen, den Fehler zu finden?

Java:
private activeUsers_spalten[] activeUsers = new activeUsers_spalten[select_count_output()];

    public activeUsers_spalten[] getSessionOutput() {
        int i = 0;
        try {
            Class.forName(db_driver);
            try {
                Connection db = DriverManager.getConnection(db_url, db_username, db_password);
                String Statement = "SELECT sessionid, username, last_activity, site, ip FROM online_users LIMIT ?, ?"; // LIMIT: start, anzahl
                PreparedStatement prepStmt = db.prepareStatement(Statement);
                prepStmt.setInt(1, first);
                prepStmt.setInt(2, rows_per_site);
                ResultSet rs = prepStmt.executeQuery();
                System.out.println("DATABASE SELECT: " + prepStmt);
                while(rs.next()) {
                    if(rs.getString("site").indexOf("/onlineusers.faces") != -1) {
                        action = "Schaut, wer gerade online ist.";
                    } else if(rs.getString("site").indexOf("/registrierung.faces") != -1) {
                        action = "Registriert sich gerade.";
                    } else if(rs.getString("site").indexOf("/suche.faces") != -1) {
                        action = "Sucht auf der Seite....";
                    } else {
                        //action = rs.getString("site");
                        action = "Aktion unbekannt!";
                    }
                    activeUsers[i] = new activeUsers_spalten(i + 1, rs.getString("sessionid"), rs.getString("username"), action, rs.getString("ip"));
                    i++;
                }
                prepStmt.close();
                rs.close();
                db.close();
            } catch (Exception db_error) {
                System.out.println(db_error);
            }
        } catch (Exception db_driver_error) {
            System.out.println(db_driver_error);
        }
        return activeUsers;
    }

    public int getSeite() {
        String seite = req.getParameter("site");
        if(seite == null) {
            site = 1;
        } else {
            site = Integer.parseInt(req.getParameter("site"));
        }
        return site;
    }

    public int getFirst() {
        first = site * rows_per_site - rows_per_site;
        return first;
    }
 
Zuletzt bearbeitet von einem Moderator:

purzel

Bekanntes Mitglied
Moin,


Wo wird denn getSessionOutput() aufgerufen ?
Die mehrfachen Ausgaben können doch nur durch mehrfachen Aufruf entstehen .....

Gruß
Klaus

Moin,

Danke für deine Antwort!
Code:
getSessionOutput()
wird auf der Seite mit einer Datatable aufgerufen:

PHP:
<h:dataTable id="onlineusers" value="#{ActiveUsers__frontend.sessionOutput}" var="item" bgcolor="#F1F1F1" border="10" cellpadding="5" cellspacing="3" first="#{ActiveUsers__frontend.first}" rows="1" width="100%" dir="LTR" frame="hsides" rules="all" summary="This is a JSF code to create dataTable.">
<h:column>
                            <f:facet name="header">
                                <h:outputText value="Username" />
                            </f:facet>
                            <h:outputText value="#{item.username}"></h:outputText>
                        </h:column>

                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Aktion" />
                            </f:facet>
                            <h:outputText value="#{item.action}"></h:outputText>
                        </h:column>
<f:facet name="footer">
                            <h:panelGroup>
                                <h:outputText value="Seite #{ActiveUsers__frontend.seite}"></h:outputText>
                            </h:panelGroup>
                        </f:facet>
                    </h:dataTable>
                    <hr />
                    <h:outputText value="#{ActiveUsers__frontend.sessionCountOutput}"></h:outputText>

LG Purzel
 
S

SlaterB

Gast
sind überhaupt mehr als ein Eintrag in der DB? was liefert SELECT *, Select count(*) usw?
funktioniert ein normale(re)s in String zusammengebautes SQL mit Limit 1, 1, und anderen Werten,
also kein PreparedStatement ?, ? verwenden?

PreparedStatment kann ja manches (where name = ?) anderes nicht (where ?[Attribut] = 'hallo'),
ob das Limit zur einen oder anderen Kategorie gehört muss sich erst durch erfolgreiches Testen herausstellen,
sonst ganz einfach nicht nehmen

edit:
> getSessionOutput() wird auf der Seite mit einer Datatable aufgerufen:

NIE NIE NIE DB- oder sonstige gefährliche Operationen an unbekannte APIs/ Darstellung überlassen,
wer weiß wie oft dort z.B. aus Spaß vorgerendert wird, damit Platzbedarf berechnet werden kann und die verrücktesten sonstigen Turbulenzen,
ein Programm kann ja wohl im sicheren Java-Umfeld Daten zusammenstellen, als Request-Daten irgendwo ablegen oder ähnliches,
und dann fertige geprüfte sichere unveränderliche Daten an die Darstellungs-Schicht weiterreichen,
inklusive DB-Verbindung geschlossen

mag aber vielleicht auch gar kein Problem sein ;)
und etwa offene DB-Verbindung wird je nach Vorstellung auch bewußt eingesetzt,
also doch eher nur als eine Meinung von mehreren ansehen ;)

edit:
die Klasse, die die Daten lädt, könnte auch cachen..
 
Zuletzt bearbeitet von einem Moderator:

purzel

Bekanntes Mitglied
sind überhaupt mehr als ein Eintrag in der DB? was liefert SELECT *, Select count(*) usw?

Ja es sind 4 Einträge drin!

funktioniert ein normale(re)s in String zusammengebautes SQL mit Limit 1, 1, und anderen Werten,
also kein PreparedStatement ?, ? verwenden?

Also in dem DB-Tool auf dem Server geht es. In Java ohne PreparedStatement muss ich noch probieren!

€dit: ohne PreparedStatement gehts auch nicht!


Ok, soll ich das dann in HTML machen, oder verstehe ich das falsch?

Mh, cachen, ist mir bisher noch nicht aufgefallen...
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> Ok, soll ich das dann in HTML machen, oder verstehe ich das falsch?

in einem fertigen Programm irgendwas umzustellen ist natürlich x mal schwieriger zu machen als schnell dahin gesagt,
ich will dich auch nicht unbedingt drängen, reicht ja vielleicht wenn der Grund gefunden wurde, logge z.B. wie oft die Methode aufgerufen wird,
am StackTrace erkennst du vielleicht ob von verschiedenen Stufen der allgemeinen Verarbeitung aus

nach meiner Philosphie gehört vor die Darstellungsschicht eine Java-Verarbeitung,
dort muss auf irgendeine Weise gewußt werden, welche Daten aktuell benötigt werden,
oder gar alle denkbaren zusätzlichen allgemeinen Daten auf Verdacht bereitgestellt werden,
die kommen als irgendwelche Attribute in irgendein Objekt 'status' und in Darstellungs-Schicht lautet der Aufruf dann

<h:dataTable id="onlineusers" value="#{status.sessionOutput}"
oder meinetwegen immer noch
<h:dataTable id="onlineusers" value="#{ActiveUsers__frontend.sessionOutput}"

führt dann jedenfalls irgendwo zu einer Methode getSessionOutput(), die einen fertigen String bzw. ein activeUser-Array zurückgibt statt eine DB-Methode aufzurufen,

ein Cache/ Lazy Loading (if (x == null) {x = .. } return x) ginge hier natürlich genauso ohne groß die ganze Welt umzustürzen
 
Zuletzt bearbeitet von einem Moderator:

purzel

Bekanntes Mitglied
Ok, Danke schon mal für die Hilfe. Vllt. lässt sich das ja umsetzen. Mal schauen wie viel Zeit ich heute noch habe um das einigermaßen umzusetzen.

Eine Loggingfunktion werde ich dann auf jeden Fall noch implementieren!

LG purzel

€dit: ich habe das jetzt in JSP nachgebaut und da funktioniert es problemlos!
 
Zuletzt bearbeitet:

jwiesmann

Bekanntes Mitglied
Hi,

ich wollte noch schnell meinen Senf dazu abgeben, da ich mal was ähnliches hatte.
Wenn deine Bean nicht im SessionScope läuft (was gut ist), dann wird der getter bzw. die Funktion die dir die Daten liefert innerhalb
des JSF Contents mehrfach aufgerufen.
Das lässt sich relativ leicht umgehen, indem du einfach ein
Java:
 public activeUsers_spalten[] getSessionOutput() {
        if (activeUsers !=null) {
            //...
        }
        return activeUsers;
    }
in deine Funktion einbaust.
Sollte sich die Liste innerhalb eines Views mal ändern, kannst du diese einfach in der Bean neu generieren.
Getter und Setter sollten möglichst keinerlei Funktion haben...

Edit sagt .. wer lesen kann .. SlaterB hat ja schon alles gesagt ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Einträge aus Datenbank einzeln darstellen (JSP, JAVA, HTML) Web Tier 9
I Daten einer Datenbank in ein Formular einfügen Web Tier 3
J Datenbank optimal zu nutzen Web Tier 8
L Servlet Datenbank Web Tier 0
M JSP Mit JSP eine SQLite Datenbank editieren? Web Tier 1
X SQL Datenbank-Daten in ApplicationScoped ManageBean zwischenspeichern? Web Tier 4
R Bild aus Datenbank ausgeben/anzeigen Web Tier 5
N Bilder aus Datenbank dynamisch in JSF streamen Web Tier 7
J Loginbereich mit Session und Datenbank Web Tier 5
E Servlet zum speichern einer Datei in einer Datenbank Web Tier 3
N Tabelle dynamisch mit Daten aus Datenbank füllen Web Tier 3
I Servlet connected nicht zur Datenbank Web Tier 2
S Problem mit Servlet und Zugriff auf Orace XE Datenbank Web Tier 2
N JSF-Tabelle erstellen aus Datenbank mittels JDBC Web Tier 12
pkm Probleme mit einem AJAX-Call in einem dynamischen Webprojekt Web Tier 15
M JSF Probleme bei Navigation mit Verzeichnisswechsel Web Tier 2
W JSF Probleme mit Data Table Web Tier 8
W JSF Probleme mit Zugriff zur Managed Bean Web Tier 11
G Probleme mit Java + Tomcat | Cannot switch on a value of type String for source level below 1.7 Web Tier 8
F JSF Probleme mit OverlayPanel Web Tier 0
H Frameset durch Tabelle ersetzten - Probleme mit jsp:include Web Tier 3
xehpuk JSF URL-Encoding-Probleme bei <h:link> (Mojarra) Web Tier 4
M ejb @Remote macht probleme Web Tier 10
S JSF SelectOneMenu - Probleme mit AJAX Web Tier 6
W Probleme mit Expression language ? Web Tier 13
J JSF JavaScript Probleme zwischen Tomahawk und Tiles!? Web Tier 2
B Probleme mit h:selectOneRadio Web Tier 2
T DWR - Probleme mit Konfiguration Web Tier 13
W JSF MyFaces Tomahawk Probleme Web Tier 4
G Probleme mit EclipseLink und Java.util.Date Web Tier 3
S JSF Probleme beim redirect im ExceptionHandler Web Tier 2
P JSF 1.2 Navigation probleme Web Tier 2
D Probleme beim installieren von WebBeans Web Tier 2
D Probleme mit Tomcat Web Tier 3
M Tomcat 6 Umlaut Probleme Web Tier 2
D Seam Example Probleme Web Tier 2
C Probleme mit JSPs in Unterverzeichnissen Web Tier 4
A [PrimeFaces] dataTable mit paginator Probleme Web Tier 2
H Probleme beim Aufrufen von Java- oder Servlet-Methoden aus Javascript Web Tier 2
0 JSF: css einbinden - Probleme Web Tier 2
M iframe probleme Web Tier 2
K [GWT] Probleme beim asynchronen Methodenaufruf mit GWT-RPC Web Tier 8
B Probleme mit RichFaces Web Tier 2
O struts2 - Probleme mit parametrisierten URLs Web Tier 5
E Probleme mit GWT & MySQL Web Tier 3
G Probleme mit Ajax Login (jsp) Web Tier 5
S Tomcat / Eclipse Probleme Web Tier 2
B Probleme mit <jsp:include page=""/> und Laufzeit Web Tier 7
P Zurück-Button des Browsers macht Probleme Web Tier 9
O Struts2: Probleme mit Links aus Packages raus Web Tier 9
A JSF+Glassfish: Probleme mit Managed Bean Web Tier 2
S Probleme mit den Nav_rules und HTML code Web Tier 2
D Probleme mit ServletRequest Web Tier 14
G Probleme mit Tomcat Web Tier 14
E RichFaces 3.2.1 Probleme Web Tier 4
W JSTL macht Probleme Web Tier 6
W JavaBeans class="" macht Probleme Web Tier 2
A Time-Out Probleme Web Tier 21
B Probleme mit Marquee Tag Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben