Java >> Java tutorial >  >> Tag >> Tomcat

Sådan administreres EntityManager livscyklus i CDI-miljø (ved hjælp af Tomcat)

Det handler ikke om CDI. EntityManagers livscyklus afhænger af dens type, som kan være:

  1. container-administrerede transaktioner,
  2. container-administreret udvidet,
  3. applikationsadministreret.

De to første er kun tilgængelige på en komplet applikationsserver. Så hvis du vil holde dig til en servletbeholder, er du indsnævret til den 3. mulighed.

Du bliver nødt til eksplicit at åbne og lukke EM'er i din applikation. Det er ligetil:Opret en applikationsdækkende forekomst af EntityManagerFactory, injicer den til alle dine bønner. Når du har brug for en EM, skal du bare oprette den, bruge den og derefter straks lukke uden at vente på, at din beans kontekst slutter. Fordi i denne konfiguration vil en åben EntityManager bevare en forbindelse, og med langlivede bønner vil du løbe tør for forbindelser. Du kan find en nem og omfattende forklaring i Opnåelse af en JPA-databaseforbindelse afsnittet i ObjectDB-manualen.


Du kan opretholde CDI-bønnetilstanden ved hjælp af CDI Scopes. Faktisk EntityManagerProducer#create() mangler omfanget. Uanset hvilken RI af CDI du har konfigureret/installeret i tomact, enten dens Weld eller OpenWebBean, kan du definere din cdi bean tilstand som belwo.

@Produces @RequestScoped
public EntityManager create() {
    return emf.createEntityManager();
}

Dit problem er

1. CDI, JSF and JPA2.  
2. Managing EntityManager lifecycle when using JPA in a non enterprise environment (e.g. Tomcat)

1. CDI, JSF og JPA2.

Tomcat-beholderen understøtter ikke CDI'en ud af boksen, selv ikke JSF, du ved, at udviklere skulle levere JSF-krukkerne til dem selv. JSF 2.2 har nye CDI-kompatible scops @ViewScoped her er @FlowScoped, der kun er CDI, som ikke har en tilsvarende for @ManagedBean.

(1) Virkelig Hvis du er mest interesseret i at bruge CDI eller CDI+JSF+JPA, så opgrader tomcat til TomEE eller gå med TomEE.Tomcat + Java EE =TomEE. Java Enterprise Edition af Tomcat,Med TomEE får du Tomcat med JPA .

(2) Hvis du ikke har kontrol over at opgradere tomcat-serveren, var du i så fald nødt til at gøre det. Lever CDI og nogle andre jar- og konfigurationsfiler sammen med weapp it self.ii. Installation af CDI i tomcat (Weld eller OpenWebBeans, disse er begge vigtige CDI-implementeringer)

(3) Tomcat 8. Tomcat 8 er justeret med Java EE 7.

2) Administrering af EntityManager-livscyklus

Administration af EntityManager-livscyklus, når du bruger JPA i et ikke-virksomhedsmiljø (f.eks. Tomcat) eller Java SE er en tilpasset opgave. I denne situation bør du overveje det rigtige omfang af EntityManager at bruge, og mens du arbejder med ressourcer, er det altid vigtigt at sikre, at de er lukkede når det ikke længere er nødvendigt.

There are three main types of EntityManagers defined in JPA.

    Container Managed and Transaction Scoped Entity Managers
    Container Managed and Extended Scope Entity Managers
    Application Managed Entity Managers

Når vi arbejder med JPA, er der to slags ressourcer, vi kan tage os af:EntityManager og transaktioner. I dette tilfælde bør du overveje det rigtige omfang af EntityManager at bruge.

1. An EntityManager is not a heavyload object.
   There is no need to use the same EntityManger longer than needed,
   You can't use an EntityManager instance for the whole application lifecycle (application scope) for the EntityManager is not Thread-safe)
2. It's not safe to traverse lazy-loaded relationships once the EntityManager is closed (This situation will change as of JPA 2.0).
i.)Method scope (i.e. instantiate/destroy one EntityManager in each business method).
   The method scope is not enough for every situation. There could be some scenarios where you'll need a wide scope, such as the following situations:
   i.  When transactions spread multiple business methods.
   ii. Need to traverse lazy-loaded relationships outside a method (e.g. in a JSF page).
   In method scope be careful to ensure the EntityManger is always closed
  ii.)Request scope (on-demand creation of the EntityManager instance to use within the request service)
   EntityManager per HTTP request strategy with the following features:
    i.  Creation on demand of the EntityManager.
    ii. Lazy closing of the EntityManager. 

The main benefit of this scope is derived from the delayed closing of the EntityManager (it will last as long as a HTTP request is in process).
Every queried entity will be managed till the end of the request and therefore during the presentation phase (the render phase in JSF for instance).

I dit tilfælde bruger du applikationsenhedsmanager og applikationsstyret transaktion, det betyder, at det er din kode, der skal håndtere transaktionen. I en nøddeskal betyder det:

Du ringer til:

entityManager.getTransaction().begin(); //to start a transaction

så hvis succes vil du sikre dig at ringe

entityManager.getTranasaction().commit(); //to commit changes to database

eller i tilfælde af fejl skal du sørge for at ringe til:

entityManager.getTransaction().rollBack();

Forestil dig nu, at du har en container, som ved, hvornår den skal ringe til begin(), commit() or rollback() , det er containerstyret transaktion.


Det største problem er, at din enhedslederproducent ikke har noget omfang. Som et resultat er det afhængigt, som aldrig bliver ryddet op. Du bør angive et omfang for din enhedsadministrator.

Den anden ting er, at Apache DeltaSpike allerede har løst dette. Hvorfor ikke bruge DeltaSpike? https://deltaspike.apache.org/documentation/jpa.html


Java tag