Mikkel

org.garret.perst.AssertionFailed: Assertion failed

10 posts in this topic

Hy,

I try to evaluate the perstdb for our specific project. At the moment I got the following error
org.garret.perst.AssertionFailed: Assertion failed
10-08 13:59:38.208 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.Assert.that(Assert.java:18)
10-08 13:59:38.208 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.impl.PagePool.find(PagePool.java:97)
10-08 13:59:38.208 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.impl.PagePool.copy(PagePool.java:126)
10-08 13:59:38.208 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.impl.StorageImpl.allocate(StorageImpl.java:476)
10-08 13:59:38.213 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.impl.StorageImpl.cloneBitmap(StorageImpl.java:874)
10-08 13:59:38.213 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3282)
10-08 13:59:38.213 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.impl.StorageImpl.storeFinalizedObject(StorageImpl.java:3178)
10-08 13:59:38.213 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at org.garret.perst.Persistent.finalize(Persistent.java:17)
10-08 13:59:38.213 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
10-08 13:59:38.213 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
10-08 13:59:38.213 16060-16069/de.micha.problem.perstdbproblem W/System.err:     at java.lang.Thread.run(Thread.java:841)

If  I remove all db.clearObjectCache(); I don't get this error, but then I got OutofMemory after a few tries.

Can you help me find out my mistake?
You can find a sample Project here: Example Project                   (I can't attach the .zip file because its  to big (27,7MB))

You only have to press the button a few times. If you see the Log
10-08 14:02:43.283 16685-16685/de.micha.problem.perstdbproblem I/DEBUG: ENDE
you can press the button again.

The error is  sporadically. Sometimes it works, but if I close the activity(press back button) and run the app again the error appears. Sometimes after a reinstall of application the error appears in first try. But I am sure you will see the error.   (I tried it with an Samsung S3)

 

 

Share this post


Link to post
Share on other sites

There is generally no need explicitly clear the object cache.

Memory overflow means that something's gone wrong:

- there are strong references to persistent objects pinning then in memory. Please check that you are not using lists,  references and standard Java collection classes in persistent classes. You should use Perst collections instead.

- insertion speed is higher than the GC's speed (ideally there should be no OOM error in such case, allocation of new objects should be blocked until the GC is able to collect some free space, but because persistent objects use finalization and so require two roundtrips of GC to deallocate their space, sometimes it can happen).

 

Assertion failure in your case is caused by concurrent access to database and clearing database cache.

The clearObjectCache method never was intended to be a normal way of dealing with cache, so it was not declared as synchronized.

You can try to replace it with:

 

    public void clearObjectCache() {

        synchronized (objectCache) {

            objectCache.clear();

        }

    }

 

 But again, this is not a proper way of solving the problem of OOM.

Share this post


Link to post
Share on other sites

Because I evaluate different Databases I have defined a datatype which I can use with all of  them. This is build up with ArrayLists. So I think there is the problem. 

My Datatype is the following.

import java.io.Serializable;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;

public class CANDatenList implements Serializable
{
    private ArrayList<String> zeitstempel;
    private ArrayList<String> header;
    private ArrayList<String> canid;
    private ArrayList<String> data;
    private static StringBuilder sb;
    
    public CANDatenList(){
        zeitstempel = new ArrayList<>();
        header = new ArrayList<>();
        canid = new ArrayList<>();
        data = new ArrayList<>();
    }
    public void add(String zeitstempel, String HEADER, String CANID, String DATA, Map HEADERMAP){
        this.zeitstempel.add(new String(zeitstempel));
        this.header.add(new String(HEADER));
        this.canid.add(new String(CANID));
        this.data.add(new String(DATA));
    }
    public void add(String zeitstempel, String HEADER, String CANID, String DATA){
        this.zeitstempel.add(new String(zeitstempel));
        this.header.add(new String(HEADER));
        this.canid.add(new String(CANID));
        this.data.add(new String(DATA));
    }
    public void add(byte[] datensatz, Map Headermap){
        String datensatz_string = new String(toBinary(datensatz));
        // 2 Byte Zeitstempel Variante
        zeitstempel.add(datensatz_string.substring(0,16));
        header.add(datensatz_string.substring(16, 24));

        int IDE = Integer.parseInt(""+(int)Headermap.get("ide"));

        switch(IDE){
            case 0: canid.add(datensatz_string.substring(24, 40));
                data.add(datensatz_string.substring(40));
                break;
            case 1: canid.add(datensatz_string.substring(24, 56));
                data.add(datensatz_string.substring(56));
                break;
        }
    }
    public void add(byte[] datensatz){
        String datensatz_string = new String(toBinary(datensatz));
        // 2 Byte Zeitstempel Variante
        zeitstempel.add(datensatz_string.substring(0,16));
        header.add(datensatz_string.substring(16, 24));

        int IDE = Integer.parseInt(datensatz_string.substring(18,19),2);

        switch(IDE){
            case 0: canid.add(datensatz_string.substring(24, 40));
                data.add(datensatz_string.substring(40));
                break;
            case 1: canid.add(datensatz_string.substring(24, 56));
                data.add(datensatz_string.substring(56));
                break;
        }
    }
    public String getDatensatzAsString(int position){
        return bitToHexString(this.zeitstempel.get(position))
                + "|" + bitToHexString(this.header.get(position))
                + "|" + bitToHexString(this.canid.get(position))
                + "|" + bitToHexString(this.data.get(position));
    }
    public String getFileString(int position){
        String returnString = "";
        returnString = bitToHexString(this.zeitstempel.get(position))           //Zeitstempel Hex
                + "\t" + this.header.get(position).substring(0, 1) + " "        //TS_OF BIT
                + "\t" + this.header.get(position).substring(1, 2) + " "        //STATUS BIT
                + "\t" + this.header.get(position).substring(2, 3) + " "        //IDE BIT
                + "\t" + this.header.get(position).substring(3, 4) + " "        //RTR BIT
                + "\t" + this.header.get(position).substring(4) + " "           //DLC BITS
                + "\t" + bitToHexString(this.canid.get(position))               //CANID HEX
                + "\t" + bitToHexString(this.data.get(position))                //DATENBYTES HEX
                + "\n";                                                         //ZEILENUMSPRUNG
        return returnString;
    }
    public String getZeitstempel(int position){
        return this.zeitstempel.get(position);
    }
    public String getHeader(int position){
        return this.header.get(position);
    }
    public String getCanid(int position){
        return this.canid.get(position);
    }
    public String getData(int position){
        return this.data.get(position);
    }
    public int getSize(){
        return this.zeitstempel.size();
    }
    public void clear(){
        this.zeitstempel.clear();
        this.header.clear();
        this.canid.clear();
        this.data.clear();
    }
    private String bitToHexString(String bitstring){
        String substring="", hexstring = "", returnstring = "";
        for(int i = 0; i < bitstring.length(); i= i+4){
            substring = bitstring.substring(i,(i+4));
            switch (substring){
                case "0000": hexstring = hexstring + "0";break;
                case "0001": hexstring = hexstring + "1";break;
                case "0010": hexstring = hexstring + "2";break;
                case "0011": hexstring = hexstring + "3";break;
                case "0100": hexstring = hexstring + "4";break;
                case "0101": hexstring = hexstring + "5";break;
                case "0110": hexstring = hexstring + "6";break;
                case "0111": hexstring = hexstring + "7";break;
                case "1000": hexstring = hexstring + "8";break;
                case "1001": hexstring = hexstring + "9";break;
                case "1010": hexstring = hexstring + "A";break;
                case "1011": hexstring = hexstring + "B";break;
                case "1100": hexstring = hexstring + "C";break;
                case "1101": hexstring = hexstring + "D";break;
                case "1110": hexstring = hexstring + "E";break;
                case "1111": hexstring = hexstring + "F";break;
                default: break;
            }
        }
        //return hexstring;
        for(int i = 0; i < hexstring.length(); i++){
            if((i > 0)&&((i%2)==0)&&(i < hexstring.length()-1)){
                returnstring = returnstring + " ";
            }
            returnstring = returnstring + hexstring.charAt(i);
        }
        return returnstring;
    }
    public Map getHeaderFromMSG(byte header_byte){
        BitSet testBitSet = byteToBits(header_byte);

        int ts_of = (testBitSet.get(7)) ? 1: 0;
        int status = (testBitSet.get(6)) ? 1: 0;
        int ide = (testBitSet.get(5)) ? 1: 0;
        int rtr = (testBitSet.get(4)) ? 1: 0;

        String dlc = (testBitSet.get(3)) ? "1": "0";
        dlc += (testBitSet.get(2)) ? "1": "0";
        dlc += (testBitSet.get(1)) ? "1": "0";
        dlc += (testBitSet.get(0)) ? "1": "0";

        int dlc_value = Integer.parseInt(dlc, 2);

        Map ret = new HashMap();

        ret.put("ts_of", ts_of);
        ret.put("status", status);
        ret.put("ide", ide);
        ret.put("rtr", rtr);
        ret.put("dlc", dlc_value);


        return ret;
    }
    public Map getHeaderFromMSG(String headerbitString){
        int ts_of = Integer.parseInt(headerbitString.substring(0, 1), 2);
        int status = Integer.parseInt(headerbitString.substring(1, 2), 2);
        int ide = Integer.parseInt(headerbitString.substring(2, 3), 2);
        int rtr = Integer.parseInt(headerbitString.substring(3, 4), 2);
        int dlc = Integer.parseInt(headerbitString.substring(4),2);

        Map ret = new HashMap();

        ret.put("ts_of", ts_of);
        ret.put("status", status);
        ret.put("ide", ide);
        ret.put("rtr", rtr);
        ret.put("dlc", dlc);

        return ret;
    }
    private String toBinary(byte[] bytes){
        sb = null;
        sb = new StringBuilder(bytes.length * Byte.SIZE);
        for(int i = 0; i < Byte.SIZE * bytes.length; i++ )
            sb.append((bytes[i / Byte.SIZE] << i % Byte.SIZE & 0x80) == 0 ? '0' : '1');
        return sb.toString();
    }
    private BitSet byteToBits(byte mByte){
        BitSet bits = new BitSet(8);
        for(int i=0; i< 8; i++){
            bits.set(i, (mByte & 1) == 1);
            mByte >>= 1;
        }
        return bits;
    }
    public CANDaten getCANdata(int position)
    {
        return new CANDaten(zeitstempel.get(position), header.get(position), canid.get(position), data.get(position));
    }

}




and my Perst Classes are:
 

import org.garret.perst.Persistent;

public class Fahrt extends Persistent
{
    private String fahrtName;
    private String fahrzeug;
    private String zeitstempel;
    private long datacount;
    private long lastlist;
    public String strKey;

    public Fahrt(String fahrtName, String fahrzeug, String zeitstempel) {
        this.fahrtName = fahrtName;
        this.fahrzeug = fahrzeug;
        this.zeitstempel = zeitstempel;
        this.strKey = fahrtName;
        this.datacount = 0;
        this.lastlist = 0;
    }

    public Fahrt() {

    }

    public String getFahrtName()
    {
        return this.fahrtName;
    }

    public String getFahrzeug()
    {
        return this.fahrzeug;
    }

    public String getZeitstempel()
    {
        return this.zeitstempel;
    }

    public void setFahrtName(String name) {
        this.fahrtName = name;
        this.strKey = this.fahrtName;
        modify();
    }

    public void setFahrzeug(String fahrzeug) {
        this.fahrzeug = fahrzeug;
        modify();
    }

    public void setZeitstempel(String zeitstempel) {
        this.zeitstempel = zeitstempel;
        modify();
    }

    public void setDatacount(long newcount) {
        this.datacount = newcount;
        modify();
    }

    public long getDatacount()
    {
        return this.datacount;
    }

    public void setLastlist(long number) {
        this.lastlist = number;
        modify();
    }

    public long getLastList()
    {
        return this.lastlist;
    }

    public String toString() {
        return this.strKey + " | " + this.fahrtName + " | " + this.fahrzeug + " | " + this.zeitstempel;
    }
}

and 

package de.micha.problem.perstdbproblem;

import org.garret.perst.Persistent;


public class FahrtData extends Persistent
{
    private String fahrtname;
    private CANDatenList list_data;
    public String strKey;
    public FahrtData(String fahrtname, long listnumber) {
        this.fahrtname = fahrtname;
        this.strKey = fahrtname+listnumber;
    }
    public FahrtData() {

    }
    public CANDatenList getList_data()
    {
        return this.list_data;
    }

    public void setList_data(CANDatenList list_data) {
        this.list_data = list_data;
        modify();
    }

    public String getFahrtname()
    {
        return this.fahrtname;
    }

    public void setFahrtname(String name){ //Methode wird nur intern von der DB benötigt, muss aber public sein
        this.fahrtname = name;
        modify();
    }

    public void updateFahrtname(String alterName, String neuerName) {
        this.fahrtname = this.fahrtname.replace(alterName, neuerName);
        this.strKey = this.strKey.replace(alterName, neuerName);
        modify();
    }

    public String toString()
    {
        return this.strKey + this.list_data.getSize();
    }
}

How can I change my FahrtData with using Perst Collections instead?

Can you give me an example of using the PerstCollections?    I think then I could change my perst classes for using this instead of my own class CANDatenList.

Share this post


Link to post
Share on other sites


Yes, ArrayList pins all its members in memory.
It is better to use Perst IPersistentList<T> interface which extends standard Java List<T>
Instance of this class can be created using Storage.createList() method.



 

Share this post


Link to post
Share on other sites

Hello,

I changed my code to use an IPersistentList instead of CANDatenList which references Standard Java.List.

As type T for IPersistentList I use my own Datatype CANDaten. This class only use four Strings, no List.  So I can store a List of CANDaten, each object contains four Strings.

If I try to commit I get the following error:

10-13 07:28:20.896 3262-3293/de.gerding.dbcompare E/AndroidRuntime: FATAL EXCEPTION: IntentService[MessService]
                                                                    Process: de.gerding.dbcompare, PID: 3262
                                                                    org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Failed to build descriptor for class de.gerding.common.CANDaten: java.lang.NoSuchMethodException: <init> []
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4373)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject(StorageImpl.java:3168)
                                                                        at org.garret.perst.PinnedPersistent.store(PinnedPersistent.java:55)
                                                                        at org.garret.perst.impl.StorageImpl.store(StorageImpl.java:5106)
                                                                        at org.garret.perst.impl.LruObjectCache.flush(LruObjectCache.java:145)
                                                                        at org.garret.perst.impl.StorageImpl.commit(StorageImpl.java:1306)
                                                                        at com.example.perstmanager.PerstDataManager.insertDataInFahrt(PerstDataManager.java:172)
                                                                        at de.gerding.dbcompare.MessService.szenario1(MessService.java:202)
                                                                        at de.gerding.dbcompare.MessService.run(MessService.java:72)
                                                                        at de.gerding.dbcompare.MessService.onHandleIntent(MessService.java:63)
                                                                        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                        at android.os.Looper.loop(Looper.java:148)
                                                                        at android.os.HandlerThread.run(HandlerThread.java:61)
                                                                     Caused by: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Failed to build descriptor for class de.gerding.common.CANDaten: java.lang.NoSuchMethodException: <init> []
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4373)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262)
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:3335)
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:4383)
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4676)
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4370)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262) 
                                                                        at org.garret.perst.impl.StorageImpl.storeObject(StorageImpl.java:3168) 
                                                                        at org.garret.perst.PinnedPersistent.store(PinnedPersistent.java:55) 
                                                                        at org.garret.perst.impl.StorageImpl.store(StorageImpl.java:5106) 
                                                                        at org.garret.perst.impl.LruObjectCache.flush(LruObjectCache.java:145) 
                                                                        at org.garret.perst.impl.StorageImpl.commit(StorageImpl.java:1306) 
                                                                        at com.example.perstmanager.PerstDataManager.insertDataInFahrt(PerstDataManager.java:172) 
                                                                        at de.gerding.dbcompare.MessService.szenario1(MessService.java:202) 
                                                                        at de.gerding.dbcompare.MessService.run(MessService.java:72) 
                                                                        at de.gerding.dbcompare.MessService.onHandleIntent(MessService.java:63) 
                                                                        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:148) 
                                                                        at android.os.HandlerThread.run(HandlerThread.java:61) 
                                                                     Caused by: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Failed to build descriptor for class de.gerding.common.CANDaten: java.lang.NoSuchMethodException: <init> []
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4373)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262)
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:3335)
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:4383)
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4676)
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4370)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262) 
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:3335) 
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:4383) 
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4676) 
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4370) 
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262) 
                                                                        at org.garret.perst.impl.StorageImpl.storeObject(StorageImpl.java:3168) 
                                                                        at org.garret.perst.PinnedPersistent.store(PinnedPersistent.java:55) 
                                                                        at org.garret.perst.impl.StorageImpl.store(StorageImpl.java:5106) 
                                                                        at org.garret.perst.impl.LruObjectCache.flush(LruObjectCache.java:145) 
                                                                        at org.garret.perst.impl.StorageImpl.commit(StorageImpl.java:1306) 
                                                                        at com.example.perstmanager.PerstDataManager.insertDataInFahrt(PerstDataManager.java:172) 
                                                                        at de.gerding.dbcompare.MessService.szenario1(MessService.java:202) 
                                                                        at de.gerding.dbcompare.MessService.run(MessService.java:72) 
                                                                        at de.gerding.dbcompare.MessService.onHandleIntent(MessService.java:63) 
                                                                        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:148) 
                                                                        at android.os.HandlerThread.run(HandlerThread.java:61) 
                                                                     Caused by: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Failed to build descriptor for class de.gerding.common.CANDaten: java.lang.NoSuchMethodException: <init> []
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4373)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262)
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:3335)
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4964)
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4370)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262) 
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:3335) 
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:4383) 
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4676) 
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4370) 
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262) 
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:3335) 
                                                                        at org.garret.perst.impl.StorageImpl.swizzle(StorageImpl.java:4383) 
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4676) 
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4370) 
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262) 
                                                                        at org.garret.perst.impl.StorageImpl.storeObject(StorageImpl.java:3168) 
                                                                        at org.garret.perst.PinnedPersistent.store(PinnedPersistent.java:55) 
                                                                        at org.garret.perst.impl.StorageImpl.store(StorageImpl.java:5106) 
                                                                        at org.garret.perst.impl.LruObjectCache.flush(LruObjectCache.java:145) 
                                                                        at org.garret.perst.impl.StorageImpl.commit(StorageImpl.java:1306) 
                                                                        at com.example.perstmanager.PerstDataManager.insertDataInFahrt(PerstDataManager.java:172) 
                                                                        at de.gerding.dbcompare.MessService.szenario1(MessService.java:202) 
                                                                        at de.gerding.dbcompare.MessService.run(MessService.java:72) 
                                                                        at de.gerding.dbcompare.MessService.onHandleIntent(MessService.java:63) 
                                                                        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:148) 
                                                                        at android.os.HandlerThread.run(HandlerThread.java:61) 
                                                                     Caused by: org.garret.perst.StorageError: Failed to build descriptor for class de.gerding.common.CANDaten: java.lang.NoSuchMethodException: <init> []
                                                                        at org.garret.perst.impl.ClassDescriptor.locateConstructor(ClassDescriptor.java:332)
                                                                        at org.garret.perst.impl.ClassDescriptor.<init>(ClassDescriptor.java:350)
                                                                        at org.garret.perst.impl.StorageImpl.getClassDescriptor(StorageImpl.java:1263)
                                                                        at org.garret.perst.impl.StorageImpl.packObject(StorageImpl.java:4361)
                                                                        at org.garret.perst.impl.StorageImpl.storeObject0(StorageImpl.java:3262)
 



 

Share this post


Link to post
Share on other sites

No Idea?
Where is my mistake. I need a fast solution.  clearing cache is by myself is not an option.

Share this post


Link to post
Share on other sites

I tried another Idea. I changed my Structure and now I am adding the CANDaten Type instead of Lists of this Type. This works fine for inserts. But If I want to read out the data it needs to much time because I have to read thirty or fiftythousand objects. 

Is there any new Idea ho to fix the first error
Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Object access violation: org.garret.perst.StorageError: Failed to build descriptor for class de.gerding.common.CANDaten: java.lang.NoSuchMethodException: <init> 

?

Share this post


Link to post
Share on other sites

To be able to instantiate a persistent object (when it is loaded from the storage) Perst requires persistent classes to have a default constructor (a constructor without parameters).
But, this is only the case if you are not using Sun's (Oracle) JVM. In the case of standard JDK, Perst can use an unsafe non-public API, allowing to instantiate objects without a public constructor.

Share this post


Link to post
Share on other sites

 Ah yes. You're right. I forgot the empty constructor in my new Class.  Seems that IPersistentList works now. Thank you. I will try it finally tomorrow.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.