1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Java Data Opject (JDO) richtig nutzen

Dieses Thema im Forum "Java Grundlagen" wurde erstellt von airtime, 17. Februar 2017.

  1. airtime

    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
     
  2. airtime

    airtime Mitglied

    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
     
  3. airtime

    airtime Mitglied

    Entschuldigt bitte hatte den Editor für code übersehen:oops:
    Hier die Klassen noch einmal:
    Code (Java):
    1. UserInfo_Test.java
    2. import javax.jdo.annotations.IdGeneratorStrategy;
    3. import javax.jdo.annotations.IdentityType;
    4. import javax.jdo.annotations.PersistenceCapable;
    5. import javax.jdo.annotations.Persistent;
    6. import javax.jdo.annotations.PrimaryKey;
    7.  
    8. @PersistenceCapable(identityType=IdentityType.APPLICATION)
    9. public class UserInfo_Test
    10. {
    11.  
    12. @PrimaryKey
    13. @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    14. private String username ;
    15.  
    16. @Persistent
    17. private String password ;
    18.  
    19. @Persistent
    20. private String emailAddress ;
    21.  
    22. public String getUsername() {
    23. return username;
    24. }
    25. public void setUsername(String username) {
    26. this.username = username;
    27. }
    28. public String getPassword() {
    29. return password;
    30. }
    31. public void setPassword(String password) {
    32. this.password = password;
    33. }
    34.  
    35. public String getEmailAddress() {
    36. return emailAddress;
    37. }
    38.  
    39. public void setEmailAddress(String emailAddress) {
    40. this.emailAddress = emailAddress;
    41. }
    42.  
    43. public UserInfo_Test(String username, String password, String emailAddress) {
    44. super();
    45. this.username = username;
    46. this.password = password;
    47. this.emailAddress = emailAddress;
    48. }
    49.  
    50. public UserInfo_Test() {
    51. super();
    52. }
    53. }
    Code (Java):
    1. UserInfo_Test.java
    2. import javax.jdo.annotations.IdGeneratorStrategy;
    3. import javax.jdo.annotations.IdentityType;
    4. import javax.jdo.annotations.PersistenceCapable;
    5. import javax.jdo.annotations.Persistent;
    6. import javax.jdo.annotations.PrimaryKey;
    7.  
    8. @PersistenceCapable(identityType=IdentityType.APPLICATION)
    9. public class UserInfo_Test
    10. {
    11.  
    12. @PrimaryKey
    13. @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    14. private String username ;
    15.  
    16. @Persistent
    17. private String password ;
    18.  
    19. @Persistent
    20. private String emailAddress ;
    21.  
    22. public String getUsername() {
    23. return username;
    24. }
    25. public void setUsername(String username) {
    26. this.username = username;
    27. }
    28. public String getPassword() {
    29. return password;
    30. }
    31. public void setPassword(String password) {
    32. this.password = password;
    33. }
    34.  
    35. public String getEmailAddress() {
    36. return emailAddress;
    37. }
    38.  
    39. public void setEmailAddress(String emailAddress) {
    40. this.emailAddress = emailAddress;
    41. }
    42.  
    43. public UserInfo_Test(String username, String password, String emailAddress) {
    44. super();
    45. this.username = username;
    46. this.password = password;
    47. this.emailAddress = emailAddress;
    48. }
    49.  
    50. public UserInfo_Test() {
    51. super();
    52. }
    53. }
    Code (Java):
    1. PMF.java
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4.  
    5. import javax.jdo.JDOHelper;
    6. import javax.jdo.PersistenceManagerFactory;
    7.  
    8.  
    9.  
    10. public class PMF {
    11.  
    12. private static PersistenceManagerFactory factory ;
    13.  
    14. protected PMF(){}
    15.  
    16. public static PersistenceManagerFactory getInstance()
    17. {
    18. if(factory==null)
    19. try {
    20. factory=JDOHelper.getPersistenceManagerFactory(new FileInputStream("datanucleus.properties"));
    21. } catch (FileNotFoundException e) {
    22. // TODO Auto-generated catch block
    23. e.printStackTrace();
    24. }
    25.  
    26. return factory ;
    27. }
    28. }
     
  4. airtime

    airtime Mitglied

    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
     
  5. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    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
     
  6. airtime

    airtime Mitglied

    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
     
  7. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    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
     
  8. airtime

    airtime Mitglied

    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
     
  9. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    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
     
    airtime gefällt das.
  10. airtime

    airtime Mitglied

    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
     
  11. airtime

    airtime Mitglied

    Hi,
    hab jetzt Hadoop hingekriegt und da gibt es ja keine Limitierung wegen der Datenmenge. Habe hierzu gleich Ambari genutzt somit ist jetzt fast alles möglich vielen Dank nochmal für den Tip.

    Aber was ich noch nicht ganz verstanden habe ist die Daten brauchen keine Struktur wie in einer Datenbank jedoch wie kann ich dann in dem Daten eine vernünftige Abfrage starten?
    Ich glaub hierzu müsste ich ein neues Thema auf machen oder?
    Ist das dann von dem MapReduce abhängig?
    Zum Beispiel ich möchte bestimmte Zahlen/Positionen finden diese hängen aber von mehrere Gegebenheiten ab, das heißt ich habe öfters die gleichen Positionen aber ich möchte nur bestimmte in Abhängigkeit der Gegebenheiten.
    Sorry falls die Frage hier fehl am Platz ist oder unverständlich, würde dann auch das erstellte Thema als erledigt ansehen.
    Gruß Air
     
Die Seite wird geladen...