通用数据挖掘系统V3.0
详细
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
书
Version 3.0
文档编号 TTS***
2012-04-11
达内IT 集团
文档历史
版本
标题
内容
作者
时间
1. 编写目的
描述DMS3.0项目的系统结构,数据实体,类的定义,类功能的实现,部署
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
,运行环境等内容,该文档用来指导程序员完成程序代码实现。文档的主要读者包括:项目分析人员,项目设计人员,项目经理,程序员,测试人员,部署人员,项目技术支持人员等。
2. 参考文档
【1】 《DMS3.0需求说明书》;文档编号:TTS***;版本号v1.0
【2】 《DMS3.0概要设计说明书》文档编号:TTS***;版本号v1.0
3. 名称解释
DMS:数据挖掘系统(Data Mining System)
系统架构:描述系统的核心功能组件和组件间的相互关联。
数据实体:描述系统需要采集,处理和保存的数据的结构。
用户登入/登出记录:在登录日志文件中记录的用户登入Unix系统的日志记录,该日志记录包含用户的登录名,用户登入Unix的时刻,登录的终端机器IP等信息。
用户的登录记录:将用户的登入记录和登出记录按照对应关系匹配起来,形成一条完整的登录记录,登录记录中包含以下信息:用户登录名,登入时刻,登出时刻,登录时长,登录终端机器IP等。
匹配的登入/登出记录:等同于用户的登录记录。
未匹配的登入记录:在登录日志文件中理论上一条登入记录跟一条登出记录匹配,但有可能在我们采集数据时用户还没有登出,所以日志文件中可能出现没有登出记录与之匹配的登入记录,这些登入记录我们将其保存在一个指定的文件中,在下次采集时再读取。
4. 系统架构综述
DMS3.0由以下几个功能模块组成:
数据读取模块,数据匹配模块,数据发送模块,数据接收模块,数据保存模块和数据整合模块,每个模块的核心功能如下:
数据读取模块:负责从用户登录记录文件和未匹配登录记录文件中读取用户的登录记录数据,将其转化为LogRec对象,然后传递给数据匹配模块匹配。
数据匹配模块:负责将用户登录记录数据,按照登入/登出的关系匹配起来,形成匹配的用户登录记录数据(MatchedLogRec对象),并计算出每次登录的时间长度。
数据发送模块:将匹配好的用户登录记录通过网络发送到采集系统服务器。
数据接收模块:服务器端接收匹配好的用户登录记录数据。
数据保存模块:将接受到的用户登录记录数据保存到数据库的用户登录记录明细表中。
数据整合模块:将用户登录记录明细表中的数据整合成日报表,月报表和年报表。
5. 静态结构设计
6. 数据实体类
根据需求分析,我们设计出以下数据实体类:
1, LogRec:登入/登出记录类,用来表示一条原始的用户登入/登出记录。
2, MatchedLogRec:匹配的登录记录类,用来表示一条匹配的用户登录记录。
以下分别对这两个实体类的设计作出说明:
6.1.1. 登入/登出记录数据类
1,登入/登出记录类(LogRec)类图:
2,登入/登出记录类(LogRec)成员变量说明:
成员变量定义
成员变量说明
备注
char logname[32]
用户登录名
int pid
用户登录的进程ID
short type
登录记录类型
7=登入;8=登出
int logtime
用户登入/登出时刻(秒)
原日志中数据单位是秒
char logip[257]
用户登录IP
6.1.2. 匹配的用户登录记录类
1,匹配的用户登录记录类(MatchedLogRec)类图:
2,匹配的用户登录记录类(MatchedLogRec)成员变量说明:
成员变量定义
成员变量说明
备注
char logname[32]
用户登录名
char logip[32]
用户登录终端IP
int logintime
用户登入时刻(秒)
原日志中数据单位是秒
int logoutTime
用户登出时刻(秒)
原日志中数据单位是秒
int durations
用户在线时间长度(秒)
char labip[257]
实验室IP
7. 数据库表设计
根据需求,设计出如下数据库表结构:
表结构:
用户登录记录明细表:
字段
类型
长度
约束
备注
登录记录编号
Number
15
PK
系统自动生成
用户ID
char
32
NOT NULL
实验室IP
char
20
NOT NULL
用户终端IP
char
257
NOT NULL
登入时间
Number
20
NOT NULL
登出时间
Number
20
NOT NULL
登录时长
Number
12
由登出时间-登入时间求得
用户登录记录日报表:
字段
类型
长度
约束
备注
用户ID
char
32
PK
实验室IP
char
20
PK
日登录时长
Number
12
NOT NULL
登出时间
Date
用户登录记录月报表:
字段
类型
长度
约束
备注
用户ID
char
32
PK
实验室IP
char
257
PK
月登录时长
Number
12
NOT NULL
登出时间
Date
用户登录记录年报表:
字段
类型
长度
约束
备注
用户ID
char
32
PK
实验室IP
char
20
PK
年登录时长
Number
12
NOT NULL
登出时间
Date
8. 总体类图
【客户端类图】
【服务端类图】
9. Client 类
Client类封装数据采集系统客户端的所有功能。
9.1.1. Client类定义
9.1.2. Client类方法说明
1)sendLogs方法定义:
方法原型
public void sendLogs()
方法功能
执行数据采集客户端的完整过程 logReader 负责读取数据 logSender
负责发送数据
参数说明
无
返回类型
void
抛出异常
调用类的异常
10. LogReader类
logReader类封装了日志读取的所有功能
10.1.1. LogReader类定义
10.1.2. LogReader成员变量说明
成员变量定义
成员变量说明
char logFileName[50]
用户登录日志文件名
char backFileName[50]
日志备份文件名
char failLoginsFileName[50]
未匹配成功的登录记录保存文件名
logins list
保存登录记录的集合
logouts list
保存登出记录的集合
matches list
保存匹配成功记录的集合
10.1.3. LogReader类方法说明
1) readLogs方法:
方法原型
public List readlogs()
方法功能
读取日志文件总调度函数 得到匹配好的集合
参数说明
无
返回类型
List
抛出异常
调用函数中可能抛出的异常
readLogs方法活动图:
2) backup方法:
方法原型
private:void backup()
方法功能
备份日志文件 把变化的文件处理成不变的 把日志文件改名即可,
系统会自动生成wtmpx文件
参数说明
无
返回类型
void
抛出异常
读取数据失败抛出BackupException
3) readFailLogins方法:
方法原型
public: void readFailLogins
方法功能
读取上一次没有匹配的 登入记录
参数说明
无
返回类型
void
抛出异常
读取数据失败抛出ReadFailLoginException
readFailLogins方法活动图:
4) readBackupFile方法:
方法原型
public: void readBackupFile
方法功能
读取备份的日志文件 把读取到的数据放入对应的属性中
参数说明
无
返回类型
Void
抛出异常
读取数据失败抛出ReadBackFileException
4) matchLogRec方法:
方法原型
public void matchLogRec()
方法功能
将用户登入/登出记录匹配为完整的登录记录 logins
,logouts进行匹配存入matches
参数说明
无
返回类型
void
抛出异常
匹配数据失败抛出MatchLogRecException
matchLogRec方法活动图:
6) saveFailLogins方法:
方法原型
public void saveFailLogins()
方法功能
将匹配失败的日志记录存到文件
参数说明
无
返回类型
无
抛出异常
匹配数据失败抛出SaveFailLoginsException
11. LogSender类
11.1.1. LogSender类定义
11.1.2. LogSender类成员变量说明
成员变量定义
成员变量说明
char failSendFileName[50]
发送失败记录的保存文件名
int fd
采集系统服务器网络描述符
unsigned short port
服务器的端口
char serverIp[20]
要连接的服务器ip
11.1.3. LogSender类方法说明
1)sendMatches方法:
方法原型
public void sendMatches(list*matches)
方法功能
发送匹配日志集合到服务端
参数说明
matches 存储发送数据的集合
返回类型
Void
抛出异常
建立连接失败抛出SendDataException
sendMatches方法活动图:
2)initSocket方法:
方法原型
public void initNetWork()
方法功能
根据ip和port 以及serverIp建立到服务端的socket连接
初始化网络
参数说明
无
返回类型
void
抛出异常
建立连接失败抛出SendDataException
3)readSendfailed方法:
方法原型
public void readSendfailed (list*matches)
方法功能
读取发送失败的数据文件
参数说明
matches: 匹配的用户日志记录列表指针
返回类型
void
抛出异常
发送数据失败抛出SendDataException
4)saveSendfailed方法:
方法原型
public void saveSendfailed (list*matches)
方法功能
存储发送失败的数据 以备下次读取发送
参数说明
matches: 匹配的用户日志记录列表指针
存储时 把集合中剩余的数据存储到文件
返回类型
void
抛出异常
发送数据失败抛出SendDataException
12. Server类
12.1.1. Server类定义
Server成员变量说明
成员变量定义
成员变量说明
char labIp[20]
实验室ip
Int fd
网络套接字描述符
DataReciveThread productor
接收数据的线程
DataSaveThread customer
存储数据的线程
UserData dataPool
线程共享数据缓冲池
1.1.1. Server类方法说明
1) initSocket方法
方法原型
public void initSocket( )
方法功能
初始化服务,启动Socket 的bind listen 和accept
参数说明
无
返回类型
void
抛出异常
DmsServerException 创建ServerSocket过程中发生的异常
2) startService方法
方法原型
public void startService( )
方法功能
响应客户连接请求,开启线程为客户服务
参数说明
无
返回类型
void
抛出异常
DMSServerException 创建相应客户请求过程中发生的异常
1.1.2. DataReciveThread类说明
成员说明:
threadid 创建线程时使用 标示一个线程对象
方法说明:
run 完成具体的数据接收工作
start 完成线程的创建和启动线程
reciveData(void *) 创建线程时调用的线程函数
1.1.3. DataSaveThread类说明
成员说明:
threadid 创建线程时使用 标示一个线程对象
logDao 向数据库中存储数据的对象
方法说明:
run 完成具体的调用dao的工作
start 完成线程的创建和启动线程
saveData(void *) 创建线程时调用的线程函数
1.1.4. LogDao类说明
方法说明:
connect 连接数据库
saveData 存储数据 根据日志记录的退出时间放入相应的日志表中
如退出时间是8日 则放入logdetail08日志表中
commitData 提交事务
disconnect 断开连接
1.1.5. UserData类说明
UserData成员变量说明
成员变量定义
成员变量说明
deque data
缓冲客户端的数据池的真正存储容器
pthread_mutex_t mutex
控制线程安全的互斥量
pthread_cont_t con_p
控制是否生产的条件量
pthread_cont_t con_c
控制是否消费的条件量
UserData类方法说明
push_data方法:
方法原型
public:void push_data(LogData rec)
方法功能
向缓冲池中加入数据
参数说明
LogData rec是要往数据库表中存储的数据
返回类型
void
抛出异常
无
pop_data方法:
方法原型
public:LogData pop_data()
方法功能
从缓冲池中取出数据
参数说明
无
返回类型
LogData
2. 异常设计
3. 客户端异常类结构图:
4. 客户端异常类说明
异常类名
异常类责任说明
备注
DmsReadException
数据读取异常。
BackupException
备份异常。
ReadFailLoginException
读取未匹配的登入数据异常。
MatchLogRecException
匹配日志记录异常。
SendDataException
发送数据异常
数据整合:
前置条件:数据已经按照登出的日期放入到了对应的详细日志表中 数据按照01到31编号。
三种类型的整合:
天整合:把每个用户 一天的使用服务器的时间做一个统计 一个用户 一天只有一条记录。规则是统计当前对应日期的前一天的数据 并把统计好的数据放入对应的天表中。
月整合:每个用户一个月对应一条数据 但这个整合不是一个月执行一次 而是一天执行一次。当进行天整合的时候要同时执行月整合 看月表中有没有这个用户的信息,如果有
则对这个用户进行更新操作,如果没有这个用户的信息则进行插入操作!
年整合:每个用户一年对应一条数据 执行的频率是一个月执行一次。当前月执行的是上一个月数据的整合,如果发现年表中已经有这个用户的信息则进行更新操作,否则就是插入操作!