JPA Datenbankabfrage bei jedem Request?!

BuckRogers

Bekanntes Mitglied
Guten Morgen zusammen,

eventuell bin ich da etwas komplett falsch angeganegen.
Folgendes Problemchen offenbart sich in meinem Progrämmchen:
Bei jedem Request wird in einer bestimmten Bean immer wieder die Datenbankabfrage ausgeführt, obwohl ich die Action/Methode nicht aufrufe.

System: JBossAS7.1.1-final, javeEE6, mysql5.5, ejb3.1, JSF mit Primefaces

server.log
Code:
07:42:25,568 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:25,576 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:26,783 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:26,787 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:26,792 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:26,798 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:26,806 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:26,813 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:26,824 INFO  [com.webApplication.navigation.NavigationBean] (http--127.0.0.1-8080-6) selected content: PROFILE
07:42:29,359 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:29,362 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:29,365 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:29,368 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:29,373 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:29,377 INFO  [com.webApplication.beans.OrderFormBean] (http--127.0.0.1-8080-6) attempting to load orderInfo data from database of user: dentist
07:42:29,381 INFO  [com.webApplication.navigation.NavigationBean] (http--127.0.0.1-8080-6) selected content: PROFILE

Die orderInfo-Daten werden abgerufen obwohl ich ganz andere Navigation vornehme. In diesem Fall navigiere ich zum user-profile, welches nichts mit der Bestellung etc. zu tun hat.

Managed Bean zur Bestellung:
Java:
@Named
@RequestScoped
public class OrderFormBean{

    Logger log = Logger.getLogger(OrderFormBean.class);

    @Inject
    OrderInfoManager orderManager;

    List<OrderInfo> orders;

    public List<OrderInfo> getOrders(HttpServletRequest request){
        HttpSession session = request.getSession();
        log.info("attempting to load orderInfo data from database of user: " +   ((User)session.getAttribute("loggedInUser")).getLoginName());
        orders = orderManager.getOrderByDentistNumber("5678");
        return orders;
    }

    public List<OrderInfo> getOrders() {
        return orders;
    }
}

OrderManager:
Java:
@Stateless
public class OrderInfoManager {

    @PersistenceContext(unitName = "MySqlDS")
    EntityManager manager;

    public void persistOrderInfo(OrderInfo given) throws OrderException {
        try {
            manager.persist(given);
        } catch (Exception e) {
            throw new OrderException("Unable to persist OrderInfo: " + given.getOrderNum(), e.getCause());
        }
    }

    public List<OrderInfo> getOrderByDentistNumber(String dentistNum) {
        List<OrderInfo> orders;
        try {
            orders = (List<OrderInfo>) manager.createNamedQuery("OrderInfo.byDentistNum").setParameter("dentistNum", dentistNum).getResultList();
        } catch (NoResultException e) {
            return null;
        }
        return orders;
    }

}

View:
HTML:
<p:dataTable value="#{orderFormBean.getOrders(request)}"
             var="o"
             paginator="true"
             rows="10">

    <f:facet name="header">
        Documents of orders
    </f:facet>

    <p:column width="100" headerText="Bestellnummer">
        <h:outputText value="#{o.orderNum}"/>

    </p:column>
    <p:column width="100" headerText="Kunde">
        <h:outputText value="#{o.dentist}"/>

    </p:column>
    <p:column width="100" headerText="Kundennummer">

        <h:outputText value="#{o.dentistNum}"/>

    </p:column>
    <p:column width="100" headerText="Bestellbezeichnung">
        <h:outputText value="#{o.orderDesc}"/>

    </p:column>
    <p:column width="100" headerText="Meterialbezeichnung">
        <h:outputText value="#{o.materialDesc}"/>

    </p:column>
    <p:column width="100" headerText="Patient">
        <h:outputText value="#{o.patientRef}"/>

    </p:column>
    <p:column width="100" style="white-space: nowrap" headerText="Liefertermin">
        <h:outputText value="#{o.deliveryDate}"/>
    </p:column>

    <p:column width="100" headerText="Status">
        <h:outputText value="#{o.orderState}"/>
    </p:column>

    <f:facet name="footer"><h:outputLabel value="#{fn:length(orderFormBean.orders)}"/>
        <h:outputLabel value="#{res['orders.table.footer']}"/></f:facet>
</p:dataTable>

Ich habe leider keine Ahnung woran das liegt. Andere Abfragen, für andere DataTables, habe ich genauso implementiert und dabei geschieht immer nur eine Abfrage. Eventuell kennt jemand diese Problematik oder kann am Code erkennen was da schief läuft. Es ist zwar kein schwerwiegendes Problem, aber nach eigenem wochenlangem suchen und failen brauche ich nun doch Hilfe bei der Angelegenheit.

Vielen Dank im Voraus.
 

Joose

Top Contributor
Du könntest dir zusätzlich zu deiner Logmeldung auch den StackTrace ausgeben lassen (diesen kann man auch ohne Exception abfragen).
Schon kontrolliert von wo die Methode "getOrders(...)" überall aufgerufen wird?
Vielleicht hast du bei einem zentralen Baustein mal Testweise diesen Aufruf eingebaut und vergessen diesen wieder zu entfernen?
 

BuckRogers

Bekanntes Mitglied
So in etwa?

Java:
for (int i=0; i< Thread.currentThread().getStackTrace().length; i++)
    System.out.println(Thread.currentThread().getStackTrace()[i].getMethodName());

Werde ich heute Abend mal machen.. Danke ;)
 

stg

Top Contributor
Typischer Anfängerfehler: Implementiere in diesem Umfeld NIEMALS Business Logic in getter-Methoden! Beim Aufbau der Seite werden die getter-Methoden unter Umständen tatsächlich mehrmals aufgerufen, das ist ganz normal (speziell bei Listen, über die iteriert wird,a lso z.B. im datatable)
Initialisiere die Liste (und alles, was sonst nötig ist) einmalig in einer PostConstruct Methode oder ähnlichem.

Dass bei jedem Request eine Abfrage gesendet ist, ist natürlich normal, da deine Bean im RequestScope ist und somit nur für jeden single request verfügbar ist.

Wenn noch was unklar istl, frag nochmal nach. Ich kann gerade nur zwischen Tür und Angel antworten...
 

BuckRogers

Bekanntes Mitglied
Danke,

ich werde erstmal eine andere Herangehensweise umsetzen und mich dann noch einmal melden ob das Problem gelöst ist oder nicht.
 

BuckRogers

Bekanntes Mitglied
Der Stacktrace war nicht hilfreich.
Habe dann einfach weiter gecodet und neue Seiten, Klassen und Abrufe implementiert. Als ich dann nach ein paar stunden mal deployte, füllten die Abfragen auf orderInfo bereits mehr als eine Bildschirmseite LOG!

Irgendetwas läuft da gehörig schief. Habe auch mal alle Filter ausgeschaltet, leider ohne Erfolg. Eventuell liegt es an der Seitennavigation, denn die OrderInfo-seite ist immer mein erster Aufruf. Ich werde es erforschen. :p
 

BuckRogers

Bekanntes Mitglied
Also ich habe da einen Workaround gefunden, auf die Schnelle. Zwar keine Dauerlösung, aber so werde ich die ständigen Requests los. Es hat bestimmt etwas mit der getterMethode auf sich, wie stg meinte.

Hier der Workaround:

HTML:
<p:commandButton    id="updateOrders"
                    title=".Aktualisieren"
                    actionListener="#{orderFormBean.updateOrders(request)}"
                    update="orderTable"/>
<p:dataTable    id="orderTable"
                value="#{orderFormBean.orders}"
                var="o"
                paginator="true"
                rows="10">

Dabei zieht sich getOrders() nur die Liste und updateOrders(Request) stochert die DB ab. Also recht unschön gelöst. aber so kann ich mal wieder zum testen deployen ohne dass die Platte wegen LogFiles volläuft ^^.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
borobudur Servlet Business-Logik wird bei jedem Request neu erstellt Web Tier 13
E Java Servlet doPost request, Mehrere Parameter mit demselben Namen aus Tabellenzeilen Web Tier 2
M XML http request zeigt die eigene Website als response Web Tier 2
M request.getUserPrincipal() Typecasting Web Tier 1
S JSF CommandButton soll keine Request starten! Web Tier 2
X Managed Bean Scope zwischen Request und Session gesucht Web Tier 6
S JSF Request länger haltbar machen *grins* oder injection.. Web Tier 6
lukas24680 Servlet pro Request Web Tier 2
7 kein Absatz mittels request.getParameter()?? Web Tier 8
S Ajax Request verhindert forward? Web Tier 8
ruutaiokwu request.getParameter() Web Tier 3
J Request weiterleiten Web Tier 6
K Struts request Zugriff Web Tier 4
I Beim zurück-Link wird immer ein Request ausgeführt Web Tier 5
F Problem mit der Methode request.getRemotePort() Web Tier 2
F Object Request Web Tier 6
L Umlaute von Formular mit request holen Web Tier 16
P request.getParameter("name") von Formular auf JSP-Seite leer Web Tier 5
P Rausfinden, wo request herkam Web Tier 4
R Request Parameter kopieren und setzen Web Tier 3
S Per HTTP Request auf Ressourcen innerhalb eines JARs zugreif Web Tier 4
L JSF Request Scope und createValueBinding() Web Tier 1
D request.contextPath in Java-Klasse ausführen Web Tier 5
E Problem mit request.getParameter Web Tier 5
F richfaches:datascroller mit request-scope Web Tier 6
F JSF: Beans in Session oder Request? Web Tier 4

Ähnliche Java Themen

Neue Themen


Oben