`
baobeituping
  • 浏览: 1048486 次
  • 性别: 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数据库的笔记,对象的SQL基本操作

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

    对象数据库db4o的示例程序,对象数据库db4o, 对象数据库db4o

    Db4o的简单操作项目

    http://www.db4o.com db4o的官网,可下载最新版本,jar包在项目的database目录下,若构建路径报错请重新添加

    db4o8.0以及db4o中文指南

    db4o8.0以及db4o中文操作指南

    db4o中文指南

    db4o 是一个开源的纯面向对象数据库引擎,对于 Java 与 .NET 开发者来说都是一个简单易用的对象持久化工具,使用简单。同时,db4o 已经被第三方验证为具有优秀性能的面向对象数据库, 下面的基准测试图对 db4o 和...

    db4o .net3.5

    db4o ,net db4o ,net db4o ,net db4o ,net

    db4o使用指南

    描述了db4o的信息要点和使用指南,讲述了一些特殊类,及其基本的使用

    DB4O-6.0

    For the fastest start with db4o please work through the tutorial, available in different formats in the following folder: ./doc/tutorial/ If you are working with db4o for Java, it is recommended...

    db4o .net2.0

    db4o .net2.0 db4o .net2.0db4o .net2.0 db4o .net2.0db4o .net2.0

    DB4O笔记+常用JAR包

    DB4O 笔记+常用 JAR包 DB4O 笔记+常用 JAR包 DB4O 笔记+常用 JAR包 DB4O 笔记+常用 JAR包 DB4O 笔记+常用 JAR包

    db4o-8.0-java

    db4o最后发布的版本,包含全部源码、jar包,eclipse下的对象查看插件、全部说明文档等。

    开源面向对象数据库 db4o 之旅

    该资源为 db4o 之旅 系列文章: 1.介绍了面向对象数据库 db4o 的基本特性,并且与传统关系型数据库以及 OR 映射技术做了比较分析,读者可以体验到 db4o 的全新的面向对象存储的理念,并且给出了性能测试数据。 2....

    DB4O管理工具

    可以查看、删除DB4O数据库中的数据,支持*.yap、*.db、*.data等DB4O数据库

    DB4O 说明文档

    DB4O 介绍信息.有兴趣的可以看看,了解一下.

    db4o开发指南和各种实例

    本资料转自网上,仅供学习DB4O开发教程使用

    非常好的Db4o资料,适合想研究Db4o的同学

    非常好的Db4o资料,包括Db4o的七章内容详细介绍及相关的论文。

    《DB4O系统应用之起步篇》

    《DB4O系统应用之起步篇》.《DB4O系统应用之起步篇》.《DB4O系统应用之起步篇》.

    DB4O 8.0 Object Manager Enterprise

    DB4O 8.0 Object Manager Enterprise 对象浏览器,db4o-8.0-tutorial.pdf

    db4o 权威指南

    db4o 权威指南 pdf 非常好

    db4o的ppt讲稿

    db4o 是一款开放源码对象导向数据库,能使 Java 和 .NET 开发人员不但大幅减低开发时间和成本, 同时能带来前所未有的效能. 另外, db4o 独有的对象导向数据库引擎能应用于免数据库管理人的流动装置或桌面平台, 套装...

Global site tag (gtag.js) - Google Analytics