Berkeley DB Java Edition 소개 및 사용(내장 형 데이터베이스)

더 읽 기
Berkeley DB Java Edition 소개 및 사용(내장 형 데이터베이스)
프로필
       Berkeley DB Java Edition(JE)은 완전히 JAVA 로 쓴 것 으로 대량의 간단 한 데 이 터 를 관리 하 는 데 적합 하 다.
        1 백만 개 에서 1 백만 개의 기록 을 효율적으로 처리 할 수 있 고 JE 데이터 베 이 스 를 제약 하 는 것 은 JE 자체 가 아니 라 하드웨어 시스템 이다.
        다 중 스 레 드 지원,JE 는 시간 초과 방식 으로 스 레 드 간 의 번 거 로 운 문 제 를 처리 합 니 다.
        Database 는 모두 간단 한 key/value 대응 형식 을 사용한다.
        사무 지원.
        2 급 라 이브 러 리 를 만 들 수 있 습 니 다.이렇게 하면 우 리 는 1 급 key,2 급 key 를 편리 하 게 사용 하여 우리 의 데 이 터 를 방문 할 수 있다.
        잦 은 IO 작업 을 줄 일 수 있 도록 RAM 버퍼 를 지원 합 니 다.
        지원 로그.
        데이터 백업 및 복구.
        커서 지원.
둘째,   JE 가 져 오기
JE 다운로드 주소:
http://www.oracle.com/technology/software/products/berkeley-db/je/index.html
가방 을 풀 고 JEHOME/lib/je-jar 의 jar 파일 을 환경 변수 에 추가 하면 je 를 사용 할 수 있 습 니 다.
관련 도움말 문 서 는 JE 참조HOME/docs/index.html
소스 코드 JE 참조HOME/src/*.*
셋째,     JE 의 흔 한 이상
Database NotFound Exception 지정 한 데이터 베 이 스 를 찾 지 못 했 을 때 이 이상 을 되 돌려 줍 니 다.
Deadlock Exception 스 레 드 간 잠 금 이상
RunRecovery Exception 에서 이상 을 회수 합 니 다.이 이상 이 발생 했 을 때 환경 변 수 를 다시 열 어야 합 니 다.
넷,     로그 파일 에 대해 알 아야 할 여섯 가지
JE 의 로그 파일 은 다른 데이터베이스 의 로그 파일 과 달리 C 판 DBD 와 도 차이 가 있 습 니 다.
        JE 의 로그 파일 은 APPEND 만 가능 합 니 다.첫 번 째 로그 파일 이름 은 0000000.jdb 입 니 다.그 가 일정한 크기 로 늘 어 났 을 때(기본 값 은 10M)두 번 째 로그 파일 0000001.jdb 를 쓰기 시 작 했 습 니 다.
        C 버 전과 달리 JE 의 데이터 로그 와 트 랜 잭 션 로 그 는 열 려 있 는 것 이 아니 라 함께 놓 여 있 습 니 다.
        JE cleaner 는 사용 하지 않 은 디스크 공간 을 청소 하고 삭제 하거나 업데이트 후 새로운 기록 이 추가 되 며 기 존 기록 공간 은 사용 하지 않 습 니 다.cleaner 는 사용 하지 않 는 공간 을 청소 합 니 다.
        청 소 는 즉각 진행 되 는 것 이 아 닙 니 다.데이터베이스 환경 을 닫 은 후에 cleaner 방법 으로 청 소 를 합 니 다.
       청 소 는 실행 만 하 는 것 이 아니 라 클 리 너 방법 을 수 동 으로 호출 하여 정 해진 시간 에 청소 해 야 합 니 다.
        로그 파일 의 삭 제 는 검사 점 이후 에 만 발생 합 니 다.cleaner 는 어떤 로그 파일 이 삭제 되 어야 하 는 지 준비 합 니 다.검사 점 이 지나 면 사용 되 지 않 는 파일 을 삭제 합 니 다.20M 로그 파일 을 쓸 때마다 검사 점 을 실행 합 니 다.기본적으로.
JE 의 영문 문서:http://www.oracle.com/technology/documentation/berkeley-db/je/GettingStartedGuide/index.html
JE 의 중국어 문서(불완전):http://fesir.itpub.net/post/4728/253789
http://fesir.itpub.net/post/4728/253789
위 에서 대충 소개 하 겠 습 니 다.다음은 제 가 업무 중 에 쓴 예 입 니 다(참고 만 제공).

package src.util;

import java.io.File;
import java.util.List;

import junit.framework.TestCase;
import src.com.bizjato.b2b.entity.Suppliers;

import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.CursorConfig;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.EnvironmentMutableConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;

/**
 *       
 * 
 * @author zhangqinjian
 *
 */
public class Jedtion extends TestCase {

	private static final String RESOURCE = ".//src//util//importData";
	private Environment env;

	private Database db, classDB;

	private StoredClassCatalog classCatalog;
	/**
	 *    ,              
	 */
	public void setUp() throws Exception {

		env = new Environment(new File(".//src//util//importData"), null);
		EnvironmentMutableConfig envMutableConfig = new EnvironmentMutableConfig();
		envMutableConfig.setTxnNoSync(true);
		env.setMutableConfig(envMutableConfig);

		DatabaseConfig dbConfig = new DatabaseConfig();
		dbConfig.setAllowCreate(true);
		db = env.openDatabase(null, "myDB", dbConfig);
		classDB = env.openDatabase(null, "classDB", dbConfig);
		classCatalog = new StoredClassCatalog(classDB);
	}
	// test: put key-value
	public void testPut(String key, Suppliers supp) throws Exception {
		EntryBinding dataBinding = new SerialBinding(classCatalog,
				Suppliers.class);
		DatabaseEntry keyEntry = new DatabaseEntry(key.getBytes("UTF-8"));
		DatabaseEntry dataEntry = new DatabaseEntry();
		dataBinding.objectToEntry(supp, dataEntry);
		db.put(null, keyEntry, dataEntry);
	}
	// test: get
	public void testGet() throws Exception {
		EnvironmentConfig envConfig = new EnvironmentConfig();
		envConfig.setAllowCreate(true);
		// envConfig.setReadOnly(true);
		env = new Environment(new File(".//src//util//importData"), envConfig);
		List myDbNames = env.getDatabaseNames();
		System.out.println("Database size: " + myDbNames.size());
		for (int i = 0; i < myDbNames.size(); i++) {
			System.out.println("Database Name: " + (String) myDbNames.get(i));
		}

		DatabaseConfig dbConfig = new DatabaseConfig();
		dbConfig.setAllowCreate(true);
		// dbConfig.setReadOnly(true);
		db = env.openDatabase(null, "myDB", dbConfig);
		classDB = env.openDatabase(null, "classDB", dbConfig);
		classCatalog = new StoredClassCatalog(classDB);

		System.out.println("Db: " + db.count());

		EntryBinding dataBinding = new SerialBinding(classCatalog,
				Suppliers.class);

		DatabaseEntry keyEntry = new DatabaseEntry("key".getBytes("UTF-8"));
		DatabaseEntry dataEntry = new DatabaseEntry();
		db.get(null, keyEntry, dataEntry, LockMode.DEFAULT);
		Suppliers p = (Suppliers) dataBinding.entryToObject(dataEntry);
		System.out.println(p.getCategory());
	}

	/**
	 * test: read database
	 * @throws Exception
	 */
	public void testStore() throws Exception {

		EnvironmentConfig envConfig = new EnvironmentConfig();
		envConfig.setAllowCreate(true);
		env = new Environment(new File(".//src//util//importData"), envConfig);

		DatabaseConfig dbConfig = new DatabaseConfig();
		dbConfig.setAllowCreate(true);
		db = env.openDatabase(null, "myDB", dbConfig);
		classDB = env.openDatabase(null, "classDB", dbConfig);
		classCatalog = new StoredClassCatalog(classDB);

		EntryBinding dataBinding = new SerialBinding(classCatalog,Suppliers.class);

		Cursor cursor = null;
		CursorConfig config = new CursorConfig();
	    config.setDirtyRead(true);
	    cursor = db.openCursor(null, config);		// open cursor

		try {
			// Database and environment open omitted for brevity
			// Open the cursor. cursor = myDatabase.openCursor(null, null);
			// Cursors need a pair of DatabaseEntry objects to operate. These hold
			// the key and data found at any given position in the database.
			DatabaseEntry foundKey = new DatabaseEntry();
			DatabaseEntry foundData = new DatabaseEntry();
			// To iterate, just call getNext() until the last database record has been
			// read. All cursor operations return an OperationStatus, so just read
			// until we no longer see OperationStatus.SUCCESS
			while (cursor.getNext(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
				// getData() on the DatabaseEntry objects returns the byte array
				// held by that object. We use this to get a String value. If the
				// DatabaseEntry held a byte array representation of some other data
				// type (such as a complex object) then this operation would look
				// considerably different.
				String keyString = new String(foundKey.getData());
				
				Suppliers supp = (Suppliers)dataBinding.entryToObject(foundData);
				System.out.println("Key - Data : " + keyString + " - "
						+ supp.getCompanyName() + "");
			}
		} catch (DatabaseException de) {
			System.err.println("Error accessing database." + de);
		} finally {
			// Cursors must be closed.
			cursor.close();
			db.close();
			classDB.close();
			env.cleanLog();
			env.close();
		}

	}

	public void tearDown() throws Exception {
		db.close();
		classDB.close();
		env.cleanLog();
		env.close();
	}

	public static void main(String[] args) {
		Jedtion t = new Jedtion();
		try {
			// t.setUp();
			// Suppliers supp = new Suppliers();
			// supp.setCategory("fivefive");
			// t.testPut("5",supp);
			// t.testGet();
			// t.testStore();
                        // t.tearDown();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

많은 의견 을 제시 하고 수정 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기