java JDBM2 的几个简单实例

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

JDBM2 提供了 HashMap 和 TreeMap 的磁盘存储功能,简单易用,用于持久化数据。特别适合用于嵌入到其他应用程序中。

HelloWorld.java

import java.io.IOException;

import jdbm.PrimaryTreeMap;
import jdbm.RecordManager;
import jdbm.RecordManagerFactory;

/**
 * This program demonstrates basic JDBM usage.
 * 
 * @author Jan Kotek
 *
 */
public class HelloWorld {
        public static void main(String[] args) throws IOException {

                /** create (or open existing) database */
                String fileName = "helloWorld";
                RecordManager recMan = RecordManagerFactory.createRecordManager(fileName);

                /** Creates TreeMap which stores data in database.  
                 *  Constructor method takes recordName (something like SQL table name)*/
                String recordName = "firstTreeMap";
                PrimaryTreeMap<Integer,String> treeMap = recMan.treeMap(recordName); 

                /** add some stuff to map*/
                treeMap.put(1, "One");
                treeMap.put(2, "Two");
                treeMap.put(3, "Three");

                System.out.println(treeMap.keySet());
                // > [1, 2, 3]

                /** Map changes are not persisted yet, commit them (save to disk) */
                recMan.commit();

                System.out.println(treeMap.keySet());
                // > [1, 2, 3]

                /** Delete one record. Changes are not commited yet, but are visible. */
                treeMap.remove(2);

                System.out.println(treeMap.keySet());
                // > [1, 3]

                /** Did not like change. Roolback to last commit (undo record remove). */
                recMan.rollback();

                /** Key 2 was recovered */
                System.out.println(treeMap.keySet());
                // > [1, 2, 3]

                /** close record manager */
                recMan.close();

        }
}

HelloWorld2.java

import java.io.IOException;
import java.io.Serializable;

import jdbm.PrimaryStoreMap;
import jdbm.RecordManager;
import jdbm.RecordManagerFactory;
import jdbm.SecondaryKeyExtractor;
import jdbm.SecondaryTreeMap;

/**
 * More advanced example to demonstrate Map usage.
 * 
 * @author Jan Kotek
 *
 */
public class HelloWorld2 {

        static class Person implements Serializable{

                /** never forget this, very important for serialization*/
                private static final long serialVersionUID = -3321252970661193623L;
                final String name;              
                final String town;
                final String country;

                /** some data to object class bigger */
                final byte[] balast = new byte[1024];

                public Person(String name, String town, String country) {
                        this.name = name;
                        this.town = town;
                        this.country = country;                 
                }

                @Override
                public String toString() {
                        return "Person [name=" + name + ", town=" + town + ", country=" + country + "]";
                }

                /** snip getters and setters*/

        }

        public static void main(String[] args) throws IOException {
                RecordManager recman = RecordManagerFactory.
                                createRecordManager("HelloWorld2");
                /**
                 * Create primary map which is used to store records.  
                 * Data can be also stored in PrimaryTreeMap and PrimaryHashMap,
                 * but this is more efficient for large objects. 
                 */
                PrimaryStoreMap<Long,Person> main = recman.storeMap("recman");

                /**
                 * Create secondary index which points to Person name.
                 * SecondaryMap is readonly, it is updated by PrimaryMap.
                 *  
                 * Secondary map have three types, 
                 * first is type of secondary index (string),
                 * second and third are copied from primary map.
                 */
                SecondaryTreeMap<String, Long, Person> nameIndex = main.secondaryTreeMap("nameIndex",
                                                new SecondaryKeyExtractor<String, Long, Person>() {
                                                        public String extractSecondaryKey(Long key, Person value) {
                                                                return value.name;
                                                        }                                       
                                                });

                /**
                 * Another secondary map which points to town and country
                 */
                SecondaryTreeMap<String, Long, Person> townIndex = main.secondaryTreeMap("townIndex",
                                new SecondaryKeyExtractor<String, Long, Person>() {
                                        public String extractSecondaryKey(Long key, Person value) {
                                                /**
                                                 * Note format of map key
                                                 */
                                                return value.country+"/"+value.town;
                                        }                                       
                                });

                /**
                 * And very simple index of Evil family members
                 */
                SecondaryTreeMap<Boolean, Long, Person> evilIndex = main.secondaryTreeMap("evilIndex",
                                new SecondaryKeyExtractor<Boolean, Long, Person>() {
                                        public Boolean extractSecondaryKey(Long key, Person value) {
                                                return value.name.contains("Evil");
                                        }                                       
                                });

                /**
                 * Clean up, if this example was run more times.
                 * All secondary indexes are updated automatically. 
                 */
                main.clear();

                /** 
                 * Add some data. 
                 * StoreMap does not have usuall 'put' method.
                 * Key is generated by Store, so use 'putValue' instead 
                 */
                main.putValue(new Person("James Bond","London","UK"));
                main.putValue(new Person("Austin Powers","London","UK"));
                main.putValue(new Person("Dr Evil","Vulcano Island","Ocean"));
                main.putValue(new Person("Scott Evil","Vulcano Island","Ocean"));               
                main.putValue(new Person("Vanessa Kensington","London","UK"));
                main.putValue(new Person("Alotta Fagina","Las Vegas","USA"));

                /**
                 * Persists inserted values
                 */
                recman.commit();

                /**
                 * Get persons with name Austin Powers
                 */
                System.out.println();
                System.out.println("Austin Powers: ");
                for(Person person:nameIndex.getPrimaryValues("Austin Powers")){
                        System.out.println("  "+person);
                }

                /**
                 * Print all Persons who lives on Vulcano Island.
                 * First we must obtain key from primary map,
                 * then 
                 */
                System.out.println();
                System.out.println("Persons on Vulcano Island: ");
                for(Person person:townIndex.getPrimaryValues("Ocean/Vulcano Island")){
                        System.out.println("  "+person);
                }

                /**
                 * Get everyone who is Evil
                 */
                System.out.println();
                System.out.println("Evil family: ");
                for(Person person:evilIndex.getPrimaryValues(true)){
                        System.out.println("  "+person);
                }               

                recman.close();
        }
}

HugeData.java

import java.io.IOException;

import jdbm.PrimaryTreeMap;
import jdbm.RecordManager;
import jdbm.RecordManagerFactory;

/** 
 * 
 * This examples generates huge map of data. 
 * It inserts 10 000 000 records, it takes about 10 minutes to finish. 
 * 
 * @author Jan Kotek
 *
 */
public class HugeData {
        public static void main(String[] args) throws IOException {

                /** open db */
        RecordManager recman = RecordManagerFactory.createRecordManager( "hugedata");        
        PrimaryTreeMap<Long, String> m = recman.treeMap("hugemap");

        /** insert 1e7 records */
        for(long i = 0;i<1e8;i++){
                m.put(i, "aa"+i);        
                if(i%1e5==0){
                        /** Commit periodically, otherwise program would run out of memory */                    
                        recman.commit();
                        System.out.println(i);                  
                }

        }

        recman.commit();
        recman.close();
        System.out.println("DONE");

        }
}

Persons1.java

import java.io.IOException;
import java.io.Serializable;

import jdbm.PrimaryTreeMap;
import jdbm.RecordManager;
import jdbm.RecordManagerFactory;
import jdbm.SecondaryKeyExtractor;
import jdbm.SecondaryTreeMap;

/**
 * Demonstrates more advanced usage of JDBM:
 * Secondary maps, 1:N relations.
 * 
 * @author Jan Kotek
 *
 */
public class Persons1 {

        static class Person implements Serializable{
                /** field used for person identification (primary key)**/
                String name;
                /** persisted with Person (embedded field in JPA terms) **/
                Address adress;
                /** N:1 relation */
                String fatherName;

                /** constructor, getters and setters are excluded for simplicity */
                public Person(String name, Address adress,String fatherName) {
                        super();
                        this.name = name;
                        this.adress = adress;
                        this.fatherName = fatherName;
                }

                public String toString(){
                        return "Person["+name+"]";
                }

                public int hashCode() {
                        return name == null? 0 : name.hashCode();
                }

                public boolean equals(Object obj) {
                        if (this == obj)
                                return true;
                        if (obj == null || !(obj instanceof Person))
                                return false;
                        Person other = (Person) obj;
                        if (name == null) {
                                if (other.name != null)
                                        return false;
                        } else if (!name.equals(other.name))
                                return false;
                        return true;
                }

        }

        static class Address implements Serializable{
                String streetName;
                String town;
                String country;

                public Address(String streetName, String town, String country) {
                        super();
                        this.streetName = streetName;
                        this.town = town;
                        this.country = country;
                }

        }

        public static void main(String[] args) throws IOException {
                //init Record Manager and dao
                RecordManager recman = RecordManagerFactory.createRecordManager("persons1");

                PrimaryTreeMap<String,Person> personsByName = recman.treeMap("personsByName");

                SecondaryTreeMap<String, String, Person> personsByTown = 
                                personsByName.secondaryTreeMap("personsByTown", 
                                                new SecondaryKeyExtractor<String, String, Person>() {
                                                        public String extractSecondaryKey(String key,Person value) {
                                                                return value.adress.town;
                                                        }
                                                });

                //create a few persons
                Person patrick = new Person("Patrick Moore", 
                                new Address("First street", "Athlone","Ireland"),
                                null);
                personsByName.put(patrick.name, patrick);

                Person jack = new Person("Jack Moore", 
                                new Address("First street", "Athlone","Ireland"),
                                patrick.name);  
                personsByName.put(jack.name, jack);

                Person paul = new Person("Paul Moore", 
                                new Address("Shop street", "Galway","Ireland"),
                                patrick.name);
                personsByName.put(paul.name, paul       );

                System.out.println("Number of persons: "+personsByName.size());

                System.out.println("Persons with name Patrick Moore: "+personsByName.get("Patrick Moore"));
                System.out.println("Name of persons living in Galway: "+personsByTown.get("Galway"));
                System.out.println("Father of Paul Moore: "+
                                personsByName.get(
                                                personsByName.get("Paul Moore").fatherName
                                        ));

        }

}

Persons2.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import jdbm.InverseHashView;
import jdbm.PrimaryStoreMap;
import jdbm.RecordManager;
import jdbm.RecordManagerFactory;
import jdbm.SecondaryKeyExtractor;
import jdbm.SecondaryTreeMap;
import jdbm.Serializer;
import jdbm.SerializerInput;
import jdbm.SerializerOutput;
import jdbm.helper.Serialization;

/**
 * Demonstrates more advanced usage of JDBM:
 * Secondary maps, 1:N relations.
 * 
 * @author Jan Kotek
 *
 */
public class Persons2 {

        static class Person implements Serializable{
                /** field used for person identification (primary key)**/
                String name;
                /** persisted with Person (embedded field in JPA terms) **/
                Address adress;
                /** N:1 relation */
                Person father;

                /** constructor, getters and setters are excluded for simplicity */
                public Person(String name, Address adress,Person father) {
                        super();
                        this.name = name;
                        this.adress = adress;
                        this.father = father;
                }

                public String toString(){
                        return "Person["+name+"]";
                }

                public int hashCode() {
                        return name == null? 0 : name.hashCode();
                }

                public boolean equals(Object obj) {
                        if (this == obj)
                                return true;
                        if (obj == null || !(obj instanceof Person))
                                return false;
                        Person other = (Person) obj;
                        if (name == null) {
                                if (other.name != null)
                                        return false;
                        } else if (!name.equals(other.name))
                                return false;
                        return true;
                }

        }

        static class Address implements Serializable{
                String streetName;
                String town;
                String country;

                public Address(String streetName, String town, String country) {
                        super();
                        this.streetName = streetName;
                        this.town = town;
                        this.country = country;
                }

        }

        /** dao object which handles Person persistence */
        static class PersonDao implements Serializer<Person>{

                /** 
                 * This is map in which persons are inserted in. 
                 * Key is number assigned by store (recordId). 
                 * You should prefer recordId as primary index, it is more flexible.   
                 */
                PrimaryStoreMap<Long,Person> persons;

                /** Inverse view on person, it helps to find recordId which belongs to person */
                InverseHashView<        Long, Person> personsInverse;

                /** 
                 * Secondary view on persons, which identifies person by name. 
                 * This map is readonly, it is autoupdated by JDBM as primary map changes. 
                 * Key is name, value is recordId ( key from primary map), 
                 * third parameter is Person (value from primary map)
                 */
                SecondaryTreeMap<String, Long, Person> personsByName;

                /** 
                 * Secondary view on persons, which identifies person its town 
                 * This map is readonly, it is autoupdated by JDBM as primary map changes. 
                 * Key is town name extracted from primary table, 
                 * value is recordId ( key from primary map), 
                 * third parameter is town from  (value from primary map) 
                 */
                SecondaryTreeMap<String, Long, Person> personsByTown;

                public PersonDao(RecordManager recman) {
                        persons = recman.storeMap("persons",this);
                        personsInverse = persons.inverseHashView("personsInverse");
                        personsByName = persons.secondaryTreeMap("personsByName",
                                                new SecondaryKeyExtractor<String, Long, Person>() {
                                                        public String extractSecondaryKey(Long key, Person value) {
                                                                return value.name;
                                                        }});
                        personsByTown = persons.secondaryTreeMap("personsByTown",
                                                new SecondaryKeyExtractor<String, Long, Person>() {
                                                        public String extractSecondaryKey(Long key, Person value) {
                                                                if(value.adress == null)
                                                                        return null;
                                                                return value.adress.town;
                                                        }});

                }

                public Person personByRecordId(Long recid){
                        return persons.get(recid);
                }

                public Person personByName(String name){
                        if(!personsByName.containsKey(name))
                                return null;
                        Iterator<Long> iter = personsByName.get(name).iterator();
                        if(iter.hasNext())
                                return personsByName.getPrimaryValue(iter.next());
                        else 
                                return null;
                }

                public Iterable<Person> personsByTown(String name){
                        List<Person> ret = new ArrayList<Person>(); 
                        for(Long l: personsByTown.get(name)){
                                ret.add(personsByTown.getPrimaryValue(l));
                        }
                        return ret;
                }

                public void insertPerson(Person person){
                        Long recid = personsInverse.findKeyForValue(person);
                        if(recid == null)
                                persons.putValue(person);
                        else
                                persons.put(recid, person);
                }

                public Person deserialize(SerializerInput in) throws IOException, ClassNotFoundException {
                        String name = in.readObject();
                        Address address = in.readObject();
                        Person father = persons.get(in.readObject());
                        Person p = new Person(name,address,father);                     

                        return p;
                }

                public void serialize(SerializerOutput out, Person obj)
                                throws IOException {
                        out.writeObject(obj.name);
                        out.writeObject(obj.adress);
                        out.writeObject(findOrPersistPerson(obj.father));
                }

                protected Long findOrPersistPerson(Person person){
                        if(person == null)
                                return null;
                        Long recid = personsInverse.findKeyForValue(person);
                        if(recid == null)
                                recid = persons.putValue(person);
                        return recid;
                }

        }

        public static void main(String[] args) throws IOException {
                //init Record Manager and dao
                RecordManager recman = RecordManagerFactory.createRecordManager("persons2");
                PersonDao dao = new PersonDao(recman);

                //create a few persons
                Person patrick = new Person("Patrick Moore", 
                                new Address("First street", "Athlone","Ireland"),
                                null);

                Person jack = new Person("Jack Moore", 
                                new Address("First street", "Athlone","Ireland"),
                                patrick);

                Person paul = new Person("Paul Moore", 
                                new Address("Shop street", "Galway","Ireland"),
                                patrick);

                //now store all this stuff              
                dao.insertPerson(jack);
                dao.insertPerson(patrick);
                dao.insertPerson(paul);

                System.out.println("Number of persons: "+dao.persons.size());

                System.out.println("Persons with name Patrick Moore: "+dao.personByName("Patrick Moore"));
                System.out.println("Persons living in Galway: "+dao.personsByTown("Galway"));
                System.out.println("Father of Paul Moore: "+dao.personByName("Paul Moore").father);

        }

}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:java 使用 Common IO 包的 FileUtils 将文件大小转成适合阅读的格式

下一篇:处理Json工具类GsonKit