pushlet+内存数据库,完成在线交流

1.背景介绍

       pushlet是服务器长连接技术,相关的demo和资料上百度或者谷歌,一搜索大把大把的,这里就不细讲。那么为什么还要用到一个内存数据库呢?

      我们写一个在线交流的东东。需求:1.能满足一对一在线交流(多对多的聊天室模式这里不讲,其实原理一样);2.能读取离线的留言信息;3.能查看聊天记录。

      利用内存数据库主要是为了能实时的进行交流,而不频繁的刷新系统的数据库,这里我采用加载了一个内存数据库的方式,能快速的读写。

2.实现方式

      2.1搭建pushlet架构

        其实网上的例子实在是太多了,这里我就随便拿一个例子来说。

       URL地址:http://my.oschina.net/dong706/blog/50671

      2.加入内存数据库

        我这里用的是H2内存数据库。增加工具类:

    

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class H2DbUtil {
 private  static Connection connection =null;
 
 public Connection getConn(){
  try {
    Class.forName("org.h2.Driver");
    connection = DriverManager.getConnection("jdbc:h2:tcp://localhost/mem:db_message", "sa", "sa");
  } catch (Exception e) {
   e.printStackTrace();
  }
  return connection;
  
 }
 
 public  void closeDB(Connection connection,Statement statement,ResultSet rSet){
  if(null!=rSet){
   try {
    rSet.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  
  if(null!=statement){
   try {
    statement.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  
  if(null!=connection){
   try {
    connection.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
 }
}

 

 

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import bsh.This;


public class FindMessage {
 private  static Connection connection =null;
 private  static ResultSet  rSet = null;
 
 public boolean isMessage(String userId){
  H2DbUtil dao = new H2DbUtil();
  connection = dao.getConn();
  Statement stmt = null;
  boolean isMessage = false;
  System.out.println(connection);
  try {
   stmt= connection.createStatement();
   System.out.println(stmt);
   boolean bool=checkDB(connection);//检查数据库中的表是否存在
   if(bool){//如果数据库中不存在该表
    String strExist = "select * from tb_message where userId = '"+userId+"' and status = 0 ";
    rSet = stmt.executeQuery(strExist);
    int index = 0;
    while(rSet.next()){
     index =1;
    }
    if(index>0){
     isMessage = true;
    }else{
     isMessage = false;
    }
   }else{//表不存在
    StringBuilder sBuilder = new StringBuilder();
    sBuilder.append("CREATE TABLE tb_message(");
    sBuilder.append("ID INT PRIMARY KEY,");
    sBuilder.append("userId VARCHAR(50) not null,");
    sBuilder.append("message varchar(2000),");
    sBuilder.append("sendUser varchar(50),");
    sBuilder.append("sendTime varchar(50) not null, ");
    sBuilder.append("status int not null, ");
    sBuilder.append("ext varchar(100));");
    stmt.executeUpdate(sBuilder.toString());
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }finally{
   dao.closeDB(connection, stmt, rSet);
   return isMessage;
  }
 }
 
 private boolean checkDB(Connection connection){
  String strExist = "select * from tb_message ";
  int number =-1;
  try {
   Statement stmt = connection.createStatement();
   ResultSet rs = stmt.executeQuery(strExist);
   number =1;
  } catch (SQLException e) {
   number =0;
  }finally{
   if(number>0){
    return true;
   }else{
    return false;
   }
  }
 }
 
}

 

改写我们的pushlet方法:

public class SendMessage implements Serializable {  
    private static final long serialVersionUID = 1L;  
   
    static public class sendMessage extends EventPullSource {  
   
         @Override 
         protected long getSleepTime() {  
             return 5000;
         }  
         @Override 
         protected Event pullEvent() {  
          FindMessage findMessage = new FindMessage();
          Event event = Event.createDataEvent("/source/event");
          System.out.println(SessionManager.getInstance().getSessions().length);
          if(SessionManager.getInstance().getSessions().length>0){
           for (int i = 0; i < SessionManager.getInstance().getSessions().length; i++) {
            Session session = SessionManager.getInstance().getSessions()[i];
            boolean bool = findMessage.isMessage(session.getId());//在这里调用内存数据库,查找是否有留言消息
            event.setField(session.getId(), bool+"");
     }
          }
             return event;  
         }  
     }  
  
 } 

 

前台JS:

   var userId = '<%=LoginUtil.getUserId() %>';
 
   PL.userId='<%=LoginUtil.getUserId() %>'; 
   PL._init();
   PL.joinListen('/source/event');
  
  function onData(event){
   var bool = event.get(userId);
   if(bool=='true'){
    document.getElementById("mymessage").style.display = "";
    document.getElementById("nomessage").style.display = "none";
   }else{
    document.getElementById("nomessage").style.display = "";
    document.getElementById("mymessage").style.display = "none";
   }
  }

 

 

 <td width="16px" valign="bottom" style="padding-left:5px; padding-right:5px;" id="mymessage">
                           <img id="v_fixMenu_title" src="frame/newframe2/images/message.gif" border="0" title="我的消息" οnclick="showNote('<%=request.getContextPath()%>')" style="cursor:pointer" />//这里是动态的小喇叭图标
                          </td>
                           <td width="16px" valign="bottom" style="padding-left:5px; padding-right:5px;" id="nomessage">
                          <img id="v_fixMenu_title" src="frame/newframe2/images/nomessage.gif" border="0" title="我的消息" οnclick="showNote('<%=request.getContextPath()%>')" style="cursor:pointer" />//这里是静态的小喇叭图标
                          </td>
                          <td width="2px">
                            <img  src="frame/newframe/images/head_shu.gif"/>
                          </td>

 

这样查看留言信息就基本上完成了。只要我们点击这个οnclick="showNote('<%=request.getContextPath()%>')"方法,进入我们自己写的页面,将留言信息显示出来。当然了,你还需要写一个根据用户ID去查找留言的方法。返回一个集合,将集合列表展示出来。

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值