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去查找留言的方法。返回一个集合,将集合列表展示出来。