一、团队博客及项目地址
二、本人负责的部分
- 整个系统的框架设计,流程设计。
- MySQL数据库设计及使用。
- 服务端面向对象设计,代码编写。
- 云服务器环境搭建及使用。
黄色框为我负责的部分
三、提交记录
四、关键代码及一些问题的解决方法
1. 手动创建线程池
//获取CPU核心数
final int coreSize = Runtime.getRuntime().availableProcessors();
//手动创建线程池
ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat("pool-%d").build();
ExecutorService threadPool = new ThreadPoolExecutor(
coreSize * 3, 200, 0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1024),
threadFactory,
new ThreadPoolExecutor.AbortPolicy()
);
说明:考虑到服务端需要频繁读写数据库,所以线程池的创建应符合IO密集型。IO密集型理论上核心线程数=CPU核心数*2
,此程序比较简单,负载较低,选择核心线程数=CPU核心数*3
。计算密集型理论上核心线程数=CPU核心数+1
。
2. 数据库读写,以下以既有读取也有更新的获取未读消息作为例子。
public List<TextMessage> getUnreadTextMessage(User user) {
//新建要返回的TextMessage数组
List<TextMessage> messageList = new ArrayList<>();
messageList.add(new TextMessage(null, null, null, null));
//获取当前用户信息
String currentUserName = user.getUserName();
//需要用到的SQL语句
//status用来标记已读(1)/未读(0), 这里是接收未读消息, 所以选择未读(0)
String sqlQuery = "SELECT * FROM `jmu-chat-room`.message WHERE receiver=? AND status='0'";
String sqlUpdate = "UPDATE `jmu-chat-room`.message SET status='1' WHERE receiver=? AND status='0'";
//取得MySQL连接
Connection connection = JdbcUtil.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
if (connection != null) {
try {
preparedStatement = connection.prepareStatement(sqlQuery);
preparedStatement.setString(1, currentUserName);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
//取出相关数据
String sender = resultSet.getString(2);
String receiver = resultSet.getString(3);
String text = resultSet.getString(5);
Timestamp time = resultSet.getTimestamp(4);
//放入数组
messageList.add(new TextMessage(sender, receiver, text, time));
}
//将未读消息标记为已读
preparedStatement = connection.prepareStatement(sqlUpdate);
preparedStatement.setString(1, currentUserName);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtil.releaseAll(resultSet, preparedStatement, connection);
}
}
return messageList;
}
3.数据库时区问题
数据库上记录的消息时间与客户端显示的时间不一致,相差了14小时。查询得知数据库默认时区是美国的-6:00,而中国是+8:00,刚好相差是14个小时。
通过set global time_zone = '+8:00'
和set time_zone = '+8:00'
修改数据库时区即可解决问题。
五、感想与总结
这次课程设计选了一个难度为A的题目,想挑战一下,结果时间紧任务重,赶在最后一刻才成功运行了程序,但是还是有很多不完美的地方,实在没时间改了。
服务器这边,由于有之前折腾服务器建站的经历,这次为了保险起见,使用宝塔面板进行服务器管理,毕竟重心应该在代码编写上,而不是在服务器环境搭建上。
这次很多东西需要自己学习,比如MySQL语句应该如何写,应该如何手动创建线程池等等。在网上查询了大量的资料,有的时候查询到的解决方法尝试之后对此次的项目并不适用,需要尝试多种解决方法。
还有很多未解决的问题,比如消息发出后接收延迟等等。
本来这次还想写文件传输和多人聊天室的,可惜实在来不及,以后如果有机会,希望能将这些功能补上去。