Java Data Opject (JDO) richtig nutzen

airtime

Mitglied
Hallo,

ich versuche verzweifelt JDO zu verstehen und zu nutzen, leider falle ich von einem ERROR oder Exception in die nächste. Ich habe schon etliche Tutorials und Beispiele probiert jedoch komme ich nicht mehr weiter und hoffe auf Eure Hilfe.
Für jeden Tipp oder Hilfe wäre ich sehr dankbar.
Ich nutze Eclipse als IDEund habe DataNucleus Plugin installiert mit hoffentlich allen zusätzlichen jars.

Um meine derzeitige Problematik besser darstellen zu können bediene ich mich einem Beispiel im Internet.
Folgende drei Klassen bestehen:
UserInfo_Test.java
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class UserInfo_Test
{

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private String username ;

@Persistent
private String password ;

@Persistent
private String emailAddress ;

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

public String getEmailAddress() {
return emailAddress;
}

public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}

public UserInfo_Test(String username, String password, String emailAddress) {
super();
this.username = username;
this.password = password;
this.emailAddress = emailAddress;
}

public UserInfo_Test() {
super();
}
}

TestJDO.java
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.datastore.JDOConnection;
import org.datanucleus.store.rdbms.query.ForwardQueryResult;
public class TestJDO
{

public static void main(String[] args)
{

System.out.println("JDO Testing Hello");

UserInfo_Test user = new UserInfo_Test("hello244345r","world","something@something.com");

PersistenceManager manager = PMF.getInstance().getPersistenceManager();

manager.makePersistent(user);
JDOConnection connection = manager.getDataStoreConnection();
Object conn = connection.getNativeConnection();

Query query = manager.newQuery(UserInfo_Test.class);

ForwardQueryResult data = (ForwardQueryResult)query.execute();

for(int i = 0 ; i < data.size() ; i++ )
{
UserInfo_Test info = (UserInfo_Test) data.get(i);

System.out.println(info.getUsername());
}
}
}

PMF.java

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;



public class PMF {

private static PersistenceManagerFactory factory ;

protected PMF(){}

public static PersistenceManagerFactory getInstance()
{
if(factory==null)
try {
factory=JDOHelper.getPersistenceManagerFactory(new FileInputStream("datanucleus.properties"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return factory ;
}
}

wenn ich dann TestJDO ausführe kommt folgende Exception:
Exception in thread "main" org.datanucleus.api.jdo.exceptions.ClassNotPersistenceCapableException: The class "UserInfo_Test" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.

Ok also müsste ich noch das Enhancement durchführen, nach längerer Recherche verstehe ich immer noch nicht was damit gemeint ist.
Auf jedenfall bringt DataNucleus ein EnhancerTool mit sobald ich dieses ausführe kamm die Fehlermeldung das ASM ausgewählt wäre und das jar fehlt, diese habe ich heruntergeladen.
Nun bekomme ich folgende Meldung wenn ich das Tool ausführe:
An error occured for ClassEnhancer "ASM" when trying to call the method "org.datanucleus.enhancer.asm.ASMClassEnhancer" on class "getClassNameForFileName" : null
und hier komme ich nicht weiter.

verzeit mir meine Unwissenheit zu JDO aber eine gute Dokumentation habe ich gefunden https://db.apache.org/jdo/
aber keine funktionierenden Beispiele um die Funktion zu verstehen.

Gruß Air
 
Hallo,

ich bin ein kleines Stück weiter gekommen.
Zunächst hatte ich einige Fehlermeldung auch im eclipse updaten usw. aber das sollte nicht bei der Problematik gestört haben.

Der Enhancer von datanucleus benötigt eine bestimmte asm.jar datei da es weit aus über 100 verschiedene versionen gibt hat es ein wenig gedauert, aber ich habe die richtige Version eingefügt.
(Vor allem müssen die anderen versionen immer wieder entfernt werden das ist sehr wichtig falls jemand das gleiche Problem hat.)
Nun konnte ich den Enhancer ausführen und hatte zunächst eine success Meldung.
Da dachte4 ich mir ich führe gleich mal die TestJDO-Klasse aus und dann kamm der nächste Fehler:
"Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 15
Exception Details:
Location:
UserInfo_Test.jdoSetusername(LUserInfo_Test;Ljava/lang/String; )V @4: ifnonnull
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 2ab4 00a3 c700 0b2a 2bb5 0039 a700 132a
0x0000010: b400 a32a 052a b400 392b b901 6005 00b1
0x0000020:

at TestJDO.main(TestJDO.java:15)"

werde mich gleich noch mit der Fehlermeldung beschäftigen, jedoch was ich wieder einmal nicht verstehe ist das ich nachdem ausführen von der JDOTest-Klasse danach den Enhancer von datanucleus zwar erneut ausführen kann jedoch auch eine Fehlermeldung wieder bekomme die mit der Fehlermeldung von JDOTest zusammenhängt?

Ich hoffe es kann mir jemand ein wenig unter die Arme greifen.

Gruß Air
 
Entschuldigt bitte hatte den Editor für code übersehen:oops:
Hier die Klassen noch einmal:
Java:
UserInfo_Test.java
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class UserInfo_Test
{

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private String username ;

@Persistent
private String password ;

@Persistent
private String emailAddress ;

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

public String getEmailAddress() {
return emailAddress;
}

public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}

public UserInfo_Test(String username, String password, String emailAddress) {
super();
this.username = username;
this.password = password;
this.emailAddress = emailAddress;
}

public UserInfo_Test() {
super();
}
}
Java:
UserInfo_Test.java
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class UserInfo_Test
{

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private String username ;

@Persistent
private String password ;

@Persistent
private String emailAddress ;

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

public String getEmailAddress() {
return emailAddress;
}

public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}

public UserInfo_Test(String username, String password, String emailAddress) {
super();
this.username = username;
this.password = password;
this.emailAddress = emailAddress;
}

public UserInfo_Test() {
super();
}
}
Java:
PMF.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;



public class PMF {

private static PersistenceManagerFactory factory ;

protected PMF(){}

public static PersistenceManagerFactory getInstance()
{
if(factory==null)
try {
factory=JDOHelper.getPersistenceManagerFactory(new FileInputStream("datanucleus.properties"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return factory ;
}
}
 
Hallo,

da es kaum (gar keine) Resonanz gibt hatte ich nach Alternativen gesucht zum Beispiel off heap Speicherung.
Da es bei off heap Lösungen ebenso wenig exemplarische Informationen im Netz gibt,
wollte ich mal fragen ob jemand sich vielleicht damit auskennt (off heap Lösungen mit java)?
Möchte ungern einen weiteren toten Beitrag starten, würde aber einen neuen starten wenn jemand bereit wäre mir unter die Arme zu greifen.

Gruß Air
 
Hi,

vielleicht ein bisschen Off-Topic, aber warum schaust du dir eine Technologie an, welche schon 20 Jahre alt ist und seit beinahe 10 Jahren keinerlei Fortschritte mehr hatte?
Warum nicht direkt JPA?

Grüsse,
BK
 
Hi BK,

das erklärt einiges. Werde mir gleich mal JPA anschauen.
Mit veralteter Technik meinst du bestimmt JDO oder?
Da ich immer mehr glaube das die off heap memory Alternative genau das ist was ich gesucht hab.

Gruß Air
 
Hi,

selbst als langjähriger Java-Entwickler kann ich mit dem "Off-Heap Memory" nicht allzu viel anfangen. Was willst du überhaupt erreichen?
Objekte persistieren? Warum nicht (wenns klein und einfach bleiben soll, ohne Datenbank) als JSON ablegen? Falls es grösser wird und du auch Relations / grössere Datenmengen / mehrere Clients hast, dann dürfte JPA / Hibernate das richtige Stichwort sein.

Grüsse,
BK
 
Hi,

vielen dank das du dir die Zeit nimmst.
Mein Anliegen ist das ich mindestens 3,5 Milliarden Punkte hab zu denen ich zunächst einzeln abfragen möchte (z.B. per key, muss aber nicht key sein) und mehrere Werte hinzufüge auch in Abhängigkeit von z.B. keys.
Die Datenstruktur ist für mich erstmal nicht das Wichtigste, sondern das Problem mit der Datenmenge zu lösen, da hatte ich zunächst an eine Datenbank gedacht deswegen JDO.
Oder ist in meinem Ansatz schon der Wurm drin?

Gruß Air
 
Hi,

also 3,5 Mrd ist schon eine Zahl... Wow, da wirst du mit einer 08/15 Datenbank tatsächlich Probleme bekommen. Die grösste Herausforderung wird eher sein, eine Datenbank zu finden, welche deine Anforderungen erfüllt und auch relativ schnell abfragbar ist. Mir fällt in der Grössenordnung eigentlich nur Oracle oder Postgres ein. Aber eventuell wäre hier eine nicht relationale Datenbank wie Hadoop der bessere Ansatz?
JPA mit Hibernate sollte hier schon möglich sein. Aber je nachdem wie viele Datensätze du abfrägst und in deiner Anwendung brauchst könnte auch reines JDBC angebracht sein. Sprich direkte Abfragen an die Datenbank und das ResultSet der Reihe nach "per Hand" verarbeiten.

Grüsse,
BK
 
Hi,

na da hab ich doch einiges zum ausprobieren :)
werde zunächst mal Hadoop probieren und wenn es nicht klappt Postgres mit JDBC und mal sehen ob es klappt.
vielen dank

Gruß Air
 

Neue Beiträge

Zurück