db4o 连接池

这几天花了点时间弄了个 db4o 连接池,比较简单,连接池原型是论坛上面的一篇文章。很简单,欢迎拍砖。

从 servlet 开始,在这里初始化连接池:

package  com;

import  java.io.File;
import  java.util.Enumeration;

import  javax.servlet.ServletConfig;
import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;


public   class  ConnectionPollServlet  extends  HttpServlet {
    
    
private   static   final  String XML_FILE_PROPERTY  =   " xmlFile " ;
    
    
/**
     * servlet init
     
*/
    
public   void  init(ServletConfig servletConfig)  throws  ServletException{
        
super .init(servletConfig);
        String appDir 
=  servletConfig.getServletContext().getRealPath( " / " );
        Enumeration names 
=  servletConfig.getInitParameterNames();
        
while (names.hasMoreElements()){
            String name 
=  (String) names.nextElement();
            String value 
=  servletConfig.getInitParameter(name);
            
if  (name.equals(XML_FILE_PROPERTY)) {
                File file 
=   new  File(value);
                
if  (file.isAbsolute()) {
                    XMLReader.configure(value);
                } 
else  {
                    XMLReader.configure(appDir 
+  File.separator  +  value);
                }
            }
        }
    }

    
/**
     * servlet destroy
     
*/
    
public   void  destroy() {
        
super .destroy();
        ConnectionPoll.destroy();
    }
}

然后是 XML 解析类:
package  com;

import  java.io.File;

import  org.dom4j.Document;
import  org.dom4j.DocumentException;
import  org.dom4j.Element;
import  org.dom4j.io.SAXReader;

public   class  XMLReader {

    
/**
     * parse XML file
     * 
@param  xmlFileName
     
*/
    
public   static   void  configure(String xmlFileName) {
        
try  {
            File file 
=   new  File(xmlFileName);
            SAXReader reader 
=   new  SAXReader();
            Document doc 
=  reader.read(file);
            Element root 
=  doc.getRootElement();

            String fileName 
=  file.getParent() + " \\ "
                
+ root.elementText( " fileName " );
            String sport 
=  root.elementText( " port " );
            String sminConn 
=  root.elementText( " minConn " );
            String sidelTime 
=  root.elementText( " idelTime " );

            
int  port  =  Integer.parseInt(sport);
            
int  minConn  =  Integer.parseInt(sminConn);
            
int  idelTime  =  Integer.parseInt(sidelTime);

            ConnectionPoll.init(fileName,port,minConn,idelTime);
        } 
catch  (DocumentException e) {
            e.printStackTrace();
        }
    }
}


连接池类:
package  com;

import  java.util.concurrent.ConcurrentLinkedQueue;

import  com.db4o.Db4o;
import  com.db4o.ObjectContainer;
import  com.db4o.ObjectServer;

public   class  ConnectionPoll {

    
private   static   int  idelTime;
    
    
private   static  ConcurrentLinkedQueue < ObjectContainer >  connectionQueue;
    
    
private  ConnectionPoll(){
    }
    
    
/**
     * init pool
     
*/
    
protected   static   void  init(String fileName, int  port, int  minConn, int  it) {
        idelTime
= it;
        ObjectServer objectServer 
=  Db4o.openServer(fileName,port);
        connectionQueue 
=   new  ConcurrentLinkedQueue < ObjectContainer > ();
        
for  ( int  i  =   0 ; i < minConn; i ++ ) {
            connectionQueue.offer(objectServer.openClient());
        }
    }

    
/**
     * get connection
     * 
@return  ObjectContainer
     * 
@throws  ConnectionTimeoutException 
     * 
@throws  InterruptedException
     
*/
    
public   static   synchronized  ObjectContainer getConnection()  throws  ConnectionTimeoutException{
        
long  expiration  =  System.currentTimeMillis()  +  idelTime;
        
while  (connectionQueue.isEmpty())
        {
            
if  (expiration  <  System.currentTimeMillis())
            {
                
throw   new  ConnectionTimeoutException( " connection timeout! " );
            }
        }
        ObjectContainer objectContainer 
=  connectionQueue.poll();
        
return  objectContainer;
        }

    
/**
     * release connection
     * 
@return  ObjectContainer
     * 
@throws  InterruptedException
     
*/
    
public   static   synchronized   void  releaseConnection(ObjectContainer objectContainer) {
        connectionQueue.offer(objectContainer);
    }
    
    
/**
     * destroy connection
     *
     
*/
    
protected   static   void  destroy() {
        
while  (connectionQueue.iterator().hasNext()){
            ObjectContainer objectContainer 
=  connectionQueue.poll();
            objectContainer.close();
        }
    }
}

超时异常类:
package  com;

public   class  ConnectionTimeoutException  extends  Exception{

    
public  ConnectionTimeoutException()
    {
    }

    
public  ConnectionTimeoutException(String s)
    {
        
super (s);
    }
}

XML 配置文件,从上到下依次是,数据库文件名、端口、初始连接数、等待时间:
<? xml version="1.0" encoding="utf-8" ?>
  
< config >
    
< fileName > auto.yap </ fileName >
    
< port > 1010 </ port >
    
< minConn > 10 </ minConn >
    
< idelTime > 1000 </ idelTime >
  
</ config >

web.xml 用于初始化的时候加载:
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
  
< servlet >
    
< servlet-name > ConnectionPoll </ servlet-name >
    
< servlet-class > com.ConnectionPollServlet </ servlet-class >
      
< init-param >
        
< param-name > xmlFile </ param-name >
        
< param-value > WEB-INF/poolConfig.xml </ param-value >
      
</ init-param >
    
< load-on-startup > 1 </ load-on-startup >
  
</ servlet >
</ web-app >


数据库文件和参数配置文件都放在 WEB-INF 文件夹下。这个连接池还未实现 maxConn(最大连接数)和对多数据库文件的支持以及日志等。

内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值