分享自己写的db4o 连接池
初步实现,如有问题欢迎拍砖。
package com.glt.table.db4oUtil;
import java.util.LinkedList;
import org.apache.log4j.Logger;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectServer;
import com.db4o.config.Configuration;
/**
* 必须实现connection pool,因为在web应用中,servlet必定是多线程的。
* 1. 支持多客户端;
* 2. 事务必须手工commit;
* 3. 一个JVM中只能同时连接一个数据库。
* 4. 使用reset()更改参数。
*
* @author guolt
*/
public class Db4oCP {
private static final Logger log = Logger
.getLogger("com.glt.table.db4oUtil");
//数据库文件路径
private static String DATAFILE = "data/tableBuying.yap";
//连接池最小保持数
private static int MIN = 5;
//连接池最大保持数
private static int MAX = 10;
// 当前已经被获取使用的连接个数
private static int counts = 0;
//存放ObjectContainer对象
private static LinkedList connectionList=null;
private static ObjectServer objectServer = null;
// must be static 否则不会主动运行,不会在static 方法之前运行
static{
try {
init();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 初始化Connection Pool中的Db4o的连接
* @throws Exception
*/
private static void init() throws Exception {
try {
connectionList=new LinkedList();
if(DATAFILE==null ||MIN==MAX){
log.error("Db4oCP initi faild, Please check configuration...");
System.exit(-1);
}
objectServer = Db4o.openServer(DATAFILE, 0);
Configuration cfg=Db4o.configure();
log.info("Db4o configuration: activationDepth:"+cfg.activationDepth());
//Db4o级联保存设置
//The default setting is 1: Only the object passed to ObjectContainer.set(java.lang.Object) will be updated.
//In client-server environment this setting should be used on both client and server sides
Db4o.configure().updateDepth(1);
for (int i = 0; i < MIN; i++) {
// 放在末尾
connectionList.add(objectServer.openClient());
}
} catch (Exception e) {
throw new Exception("Db4o init Faild");
}
log.info("Db4oCP init OK[DataFile:"+DATAFILE + "|MIN:"+MIN +"|MAX:"+MAX+ "|Free:" + connectionList.size()+"]");
}
public synchronized static ObjectContainer getODBConnection() throws Exception {
if (connectionList == null) {
log.error("Db4oCP is null.");
}
while (connectionList.isEmpty()) {
// 如果在MIX,MAX之间仍然创建并返回;否则出错。
if (counts < MAX) {
log.debug("DB4oCP free over MIN ,now new One CP..");
connectionList.add(objectServer.openClient());
} else {
throw new Exception("DB4oCP over MAX.");
}
}
// 移除并返回此列表的第一个元素
ObjectContainer odb = (ObjectContainer) connectionList.removeFirst();
counts++;
log.info("Db4oCP getODBConnection OK[used:" + counts + " |MAX:" + MAX + "|Free:" + connectionList.size()+"]");
return odb;
}
/**
* 释放,回收连接。
*/
public synchronized static void release(ObjectContainer odb) {
if(odb==null){
return;
}
counts--;
connectionList.add(odb);
log.info("Db4oCP release OK[used:" + counts + "|MAX:"+MAX+"|Free:"
+ connectionList.size()+"]");
//must set null ,or else be conflict.
odb=null;
}
/**
* 关闭数据库连接池
* @deprecated 调用会产生不可预料结果
* */
public static void cloesDB(){
connectionList=null;
counts=0;
objectServer.close();
}
/**
* 重置数据库连接池
* */
public static void reset(String dataFile,int min,int max){
DATAFILE=dataFile;
MIN=min;
MAX=max;
connectionList=null;
counts=0;
objectServer.close();
try {
init();
log.info("Db4oCP reset OK[DataFile:"+DATAFILE + "|MIN:"+MIN +"|MAX:"+MAX+ "|Free:" + connectionList.size()+"]");
} catch (Exception e) {
e.printStackTrace();
}
}
}