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();
}
}
}
많은 의견 을 제시 하고 수정 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
H2 데이터베이스 사용자 정의 함수 방법 및 범례H2 데이터 베 이 스 는 자바 가 구현 한 메모리 데이터베이스 입 니 다.내장 형 메모리 데이터 베 이 스 를 사용 할 수 있 지만 그 특성 에 대해 서 는 실제 프로젝트 에 적용 할 만 한 의 미 를 더 많이 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.