`
baobeituping
  • 浏览: 1064669 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

关于DB4O的学习总结

阅读更多

一下是一个DB4O的操作DAO。

作为DB4O在WEB项目中的操作,如果每次调用接口NEW一个对象去取得查询文件的时候,系统会报错,表示所读的DB文件已经被锁住了。查看了网上的一些解决方式。最后自己实现,解决了问题。

 

解决方法。在WEB容器启动的时候,新建一个监听器

WebListener.java

package common.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import common.util.db4o.LogMessageDao;


public class WebListener implements ServletContextListener  {

 
 LogMessageDao logdao;
 private static final ThreadLocal local = new ThreadLocal();
 public void contextDestroyed(ServletContextEvent sce) {
  // TODO Auto-generated method stub
  
 }

 public void contextInitialized(ServletContextEvent event) {
  
  String path =event.getServletContext().getRealPath("/log/log.db");
  logdao = logdao.getInstance(path);
  //local.set(logdao);
  event.getServletContext().setAttribute("LogDao", logdao);

//在监听器中将要用到查DB文件的DAO类放入到ServletContext中
  // TODO Auto-generated method stub
  
  
 }

 
}

然后在我们用用的时候,在一个JSP页面的用法,从ServletContext中拿出来。

LogMessageDao logdao = (LogMessageDao)config.getServletContext().getAttribute("LogDao");
  
   System.out.println("logdao:"+logdao);
   List<LogMessage> list= logdao.getAllMessage();
   for(int i=0;i<list.size();i++)
   {
    LogMessage lg = (LogMessage)list.get(i);
    %>
     <log>
     <perid><%=lg.getPerID() %></perid>
     <remoteip><%=lg.getRemoteIP() %></remoteip>
     <date><%=lg.getDate() %></date>
     </log>
    <%
   }

 

//这样就不会造成文件被锁住了。

 

下面是DAO的JAVA文件

 

package common.util.db4o;

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

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.Configuration;
import com.db4o.io.CachedIoAdapter;
import com.db4o.io.RandomAccessFileAdapter;
import com.db4o.query.Constraint;
import com.db4o.query.Query;


public class LogMessageDao {

  private static LogMessageDao messageDao = null;
     private Configuration configuration = null;
     private ObjectContainer db = null;
     private String path;

     private LogMessageDao(String path) {
         configuration = Db4o.newConfiguration();
//         configuration.io(new RandomAccessFileAdapter());
         configuration.io(new CachedIoAdapter(new RandomAccessFileAdapter()));
         configuration.optimizeNativeQueries(true);
        
         configuration.objectClass(LogMessage.class).objectField("perID").indexed(true);
   configuration.objectClass(LogMessage.class).objectField("remoteIP").indexed(true);
   configuration.objectClass(LogMessage.class).objectField("date").indexed(true);

         this.path = path;
         openDB4O(path);
     }

     /**
      * 获取实例
      * @param path
      * @return
      */
     public static LogMessageDao getInstance(String path) {
         if (messageDao == null) {
             messageDao = new LogMessageDao(path);
         }
         return messageDao;
     }
    
         public List<LogMessage> getHistory(String to, String beginDate, String endDate,int msgType) {
         List<LogMessage> msgList = null;
         Query query = db.query();
         query.constrain(LogMessage.class);
        
         Constraint constr = query.descend("from").constrain(to);
        
         query.descend("date").constrain(beginDate).greater().equal();
         query.descend("date").constrain(endDate).smaller().equal();
        
         if(msgType == 0){  //msgType=0 表示查询普通聊天记录
             query.descend("to").constrain(to).or(constr);
         } else if(msgType == 1){  //msgType=1 表示查询群聊天记录
             query.descend("from").constrain(to);
         }
        
         query.descend("date_time").orderAscending();
        
         ObjectSet result = query.execute();
         msgList = (result == null) ? new ArrayList<LogMessage>() : result;
         return msgList;
     }

     /**
      * 查询外部IM的历史记录
      * @param to  查询对象
      * @param me  查询人的jid
      * @param con  当前xmpp连接实例
      * @param beginDate  查询的开始日期
      * @param endDate 查询的结束日期
      * @return
      */
     public List<LogMessage> getImHistory(String to, String me, String con, String beginDate, String endDate) {
         List<LogMessage> msgList;
         Query query = db.query();
         query.constrain(LogMessage.class);
        
         Constraint constr1 = query.descend("from").constrain(me);
         Constraint constr2 = query.descend("from").constrain(to);

         Constraint constr3 = query.descend("to").constrain(con).and(constr2);
        
         query.descend("date").constrain(beginDate).greater().equal();
         query.descend("date").constrain(endDate).smaller().equal();
        
         query.descend("to").constrain(to).and(constr1).or(constr3);
         query.descend("date_time").orderAscending();
        
         ObjectSet result = query.execute();       
         msgList = (result == null) ? new ArrayList() : result;
         return msgList;
     }
    
     /**
      * 获取一个群最后一个消息的收发时间
      * @param room
      * @return
      */
     public long getLastMsgDate(String room){
         Query query = db.query();
         query.constrain(LogMessage.class);
         query.descend("from").constrain(room);
         query.descend("date_time").orderDescending();
         ObjectSet<LogMessage> result = query.execute();
        
         long date_time = (result != null && result.size() > 0) ? result.get(0).getDate_time() : 0;
         return date_time;
     }

     /**
      * 保存一条消息到数据库
      * @param msg
      */
     public void saveMsg(LogMessage msg) {
         if (db.ext().isClosed()) {
             openDB4O(path);
         }
       
         db.store(msg);
         db.commit();
     }

     /**
      * 打开Db4o数据库
      * @param path
      */
     public void openDB4O(String path) {
         File tempFile = new File(path);
         String tempStr = tempFile.getAbsolutePath();
         int index = tempStr.lastIndexOf(File.separatorChar);
         if (index > 0) {
             String path2 = tempStr.substring(0, tempStr.lastIndexOf(File.separatorChar));
             File file = new File(path2);
             if (!file.exists()) {
                 file.mkdirs();
             }
         }
         db = Db4o.openFile(configuration, path);
     }

     public void closeDB4O() {
         db.close();
     }
     public List<LogMessage> getAllMessage()
  {
   List<LogMessage> mymessage=null;
   
   Query query = this.db.query();
   query.constrain(LogMessage.class);
   
   ObjectSet objset = query.execute();
   mymessage = objset;
  
   return mymessage;
  }
    
     public void save(String path,String perID,String remoteIP)
  {
      if (db.ext().isClosed()) {
             openDB4O(path);
         }
   java.util.Date date = new java.util.Date();
   java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
   String strDate = df.format(date); //当天日期
   
   
   LogMessage lm = new LogMessage();
   lm.setPerID(perID);
   lm.setRemoteIP(remoteIP);
   lm.setDate(strDate);
   db.store(lm);
   db.commit();
   
   
   
  }
     public static void main(String[] args) {
//          }
}

分享到:
评论

相关推荐

    DB4o学习笔记 对象的SQL基本操作

    DB4o(Database for Objects)是一款开源的对象数据库系统,它允许开发者直接在内存中以对象的形式存储、查询和检索数据,无需转换为关系型数据库的表格形式。在本笔记中,我们将深入探讨DB4o的对象SQL基本操作,...

    db4o-8.0-java

    总结来说,"db4o-8.0-java" 是一个完整的db4o对象数据库解决方案,包含所有必要的组件,让Java开发者能够轻松地在自己的项目中实施对象数据库。源码、jar包、Eclipse插件和文档的提供,使得开发、调试和学习过程变得...

    对象数据库db4o对象数据库db4o

    **对象数据库db4o详解** 对象数据库是一种新型的数据库管理系统,与传统的关系型数据库不同,它直接存储和管理对象,而不是将对象转换为表格...无论是学习还是实际开发,db4o都是一个值得探索的对象数据库解决方案。

    db4o开发指南和各种实例

    **db4o 开发指南与实例详解** **一、db4o 简介** db4o(Database for Objects)是一款开源的对象关系数据库管理...通过学习上述知识点,开发者可以熟练掌握db4o的使用,从而在项目中实现高效、便捷的对象持久化管理。

    DB4o 将一个对象保存到文件中,然后查询读取

    通过深入学习DB4o的API和特性,你可以更好地利用这个工具来简化对象持久化的工作流程。 总结一下,DB4o是一个强大且灵活的对象数据库,它可以简化Java开发中的数据存储和检索。通过配置对象、打开数据库、存储和...

    db4o8.0的相关API

    总结一下,db4o8.0的API是一个全面的对象数据库工具集,提供了丰富的功能来简化对象的持久化和查询。源码和核心jar文件的提供为开发者提供了深入学习和定制db4o的机会,使其能够在Android开发中发挥重要作用。通过...

    db4o-8.0 相关的jar包,适用java开发,Android开发

    开发者可以通过阅读这些文档,学习如何在自己的项目中正确地集成和使用db4o。 **目录结构**: 压缩包内的目录结构可能包含以下几个部分: 1. **lib**:这个目录下通常会有不同版本的db4o jar包,包括核心库、客户...

    面向 Java 开发人员的 db4o 指南 结构化对象和集合

    总结来说,面向Java开发人员的db4o指南是关于如何使用db4o这个对象数据库系统来高效、便捷地管理结构化对象和集合的教程。它涵盖了db4o的基本概念、API使用、查询语言、性能优化以及数据库的配置和管理等方面,旨在...

    黑金开发板DB4CE15原理图

    "黑金开发板DB4CE15原理图"是一份专为FPGA学习者设计的文档,它包含了关于黑金开发板核心板和底板的详细电路原理图。通过研究这些图纸,用户能够深入理解FPGA如何与各种硬件资源相互作用,从而提升其在FPGA设计和...

    DAL.rar_DAL_employee attendance_java Attendance

    总结来说,"DAL.rar_DAL_employee attendance_java Attendance" 是一个使用Java技术和DB4O数据库构建的员工考勤及休假追踪系统的数据访问层项目。它涉及了对象数据库的概念,Java编程的面向对象特性,以及数据访问层...

    mongodb学习总结.docx

    - **对象存储**:如 db4o,直接使用面向对象的方式来存储和检索数据。 4. **MongoDB 特点**: - **面向集合存储**:数据以集合的形式组织,类似于 RDBMS 的表,但不需要预定义模式。 - **动态查询**:支持多种...

    eu.roelbouwman-开源

    总结来说,"eu.roelbouwman-开源"是一个利用Java、Jetty、Ajax、Echo2和db4o技术的开源项目,旨在提供一个快速构建高效Web应用的解决方案。开发者可以通过这个项目学习到如何将这些技术集成到一起,创建出具有高度...

    JPOX is a free and fully compliant implementation

    通过JPOX可以实现Java对象的透明持久化,支持市场上主要的关系数据库管理系统(RDBMS)以及DB4O对象数据存储。JPOX还能够满足现代应用程序所需的多种对象关系映射(ORM)模式,并支持JDOQL、SQL或JPQL等多种查询语言。 ...

    Android入门资料

    2. **系统库和运行环境**:包括 OpenGL ES(用于 2D 和 3D 图形)、SQLite(关系型数据库)、db4o(对象数据库)和媒体库等。Google 使用 Apache Harmony 类库,支持全面开源的 Java 开发,同时 Dalvik 虚拟机运行...

    程序简单花样齐全的流水灯.pdf

    《程序简单花样齐全的流水灯》是一篇关于利用单片机设计流水灯程序的文章,主要讲解如何通过硬件电路和C语言编程实现五种不同样式的流水灯效果。下面将详细阐述其中涉及的知识点。 首先,文章中提到的硬件电路设计...

Global site tag (gtag.js) - Google Analytics