您的位置:首页 > 数据库

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

2013-11-20 13:26 204 查看
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="我的消息" onclick="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="我的消息" onclick="showNote('<%=request.getContextPath()%>')" style="cursor:pointer" />//这里是静态的小喇叭图标

                          </td>

                          <td width="2px">

                            <img  src="frame/newframe/images/head_shu.gif"/>

                          </td>

 

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

 

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: