EJB: Objekte an Server senden

B

bananenkasper

Gast
Hallo,

ich habe eine EJB3.0 Anwendung auf einem JBoss 6 laufen.

Jetzt möchte ich über eine Client-Application Dateien einlesen und als Object zum Server senden, der diese Daten dann in einer Datenbank ablegt.

Mit wenigen Objekten ~100 klappt es auch anstandslos, aber mit ~1000 tut sich lange wenig, bis es zu einem
Code:
java.lang.OutOfMemoryError: Java heap space
kommt.

Ich mutmasse dass irgendwas mit der Serialisierung suboptimal läuft, weiß aber nicht wie ich überprüfen kann, was wirklich so lange dauert.

Hier ist etwas Code:

Client:
Java:
public void upload() throws Exception {
		info("reading files");
		List<? extends Fraction> fractions = readFractions();
		
		final Sample s = new SampleImpl(sampleName, new UserImpl(), fractions);
		
		info("uploading " + fractions.size() + " fractions (raw)");
		session.addSample(s);
		info("normalizing sample + [" + s.getId() + "]");
		session.normalizeSample(s.getId(), choosenNormalizationMethod, standards, massDelta);
	}

Server:
Java:
@Override
	public void addSample(Sample sample) throws Exception {

		log.debug("Adding sample [" + sample.getId() + "]");

		final SampleBean bean = JPAUtils.createSampleBean(sample);

		try {

			log.debug("storing to db");

			em.persist(bean);

			log.debug("store successful");

		} catch (Throwable t) {
			log.debug(t.getLocalizedMessage(), t);
			throw new EJBException("could not add sample");
		}

	}

Output:
Code:
INFO trying to connect
INFO conneted
INFO reading files
INFO uploading 962 fractions (raw)
ERROR Transaction rolled back

Danke!
 

fastjack

Top Contributor
Wo kommt es denn zu der Exception? Im jBoss oder im Client? Von Haus aus sind im jBoss 64MB voreingestellt, ich würde das aufstocken. Sind die Dateien denn groß?
 
Zuletzt bearbeitet:
B

bananenkasper

Gast
Danke für die schnelle Antowort!

Die Exception war auf dem Server, als er versucht hat die Transaction zurückzurollen, weil irgendwas schief gelaufen ist.

Mit mehr Memory klappt es, aber der upload dauert immernoch sehr lange.

Irgendwelche Ideen wie ich den Upload beschleunigen könnte?
 

FArt

Top Contributor
Wo bleibt denn die Zeit? Große Daten streamt man in der Regel, das ist schonender bzgl. der benötigten Ressourcen.
 
B

bananenkasper

Gast
Die Zeit ist beim Konvertieren in Persistence Entities und dem Speichern dieser in der DB drauf gegangen.
Mache es jetzt asynchron mittels MDBs, dann kann der Client nach dem Upload direkt was anderes machen, während der Server noch in die DB läd.

Werden die Serialisierten Objekte nicht eh als ByteStream gesendet?
 

FArt

Top Contributor
Die Zeit ist beim Konvertieren in Persistence Entities und dem Speichern dieser in der DB drauf gegangen.
Mache es jetzt asynchron mittels MDBs, dann kann der Client nach dem Upload direkt was anderes machen, während der Server noch in die DB läd.

Werden die Serialisierten Objekte nicht eh als ByteStream gesendet?

Das Umsetzen auf Entitäten sollte nicht lange daueren. Evtl. an der DB optimieren, z.B. passendere Datenstruktur.
Natürlich werden die Objete sowieso als Stream gesendet, aber in deinem Fall muss alles erst mal im Speicher komplett vorliegen, auf der Serverseite auch ...
 
B

bananenkasper

Gast
Ja, das "Problem" ist, dass die Objecte zunächst nicht als Entity vorliegen, sondern erst konvertiert werden müssen.
Ich weiss nicht genau ob der Flaschenhals an dieser Stelle liegt, oder doch beim Speichern selbst.

Jedenfalls wird der Client jetzt nicht mehr blockiert, in sofern hat sich die Sache erstmal erledigt ;).
 

peez

Bekanntes Mitglied
@bananenkasper dann solltest du auf jeden Fall sicherstellen, dass der User deine Anwendung nicht schließen kann solange noch ein Transfer aktiv ist ;)

@FArt - vor der Frage stand ich auch vor kurzem - wie große Objekte (Files) per EJB vom Client zum Server und umgekehrt transferieren? Wie genau würde das "streamen" von Statten gehen?
 

Ähnliche Java Themen

Neue Themen


Oben