Java课程设计总结

一、团队博客及项目地址

团队博客
Gitee项目

二、本人负责的部分

  1. 整个系统的框架设计,流程设计。
  2. MySQL数据库设计及使用。
  3. 服务端面向对象设计,代码编写。
  4. 云服务器环境搭建及使用。

黄色框为我负责的部分

三、提交记录

四、关键代码及一些问题的解决方法

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语句应该如何写,应该如何手动创建线程池等等。在网上查询了大量的资料,有的时候查询到的解决方法尝试之后对此次的项目并不适用,需要尝试多种解决方法。
还有很多未解决的问题,比如消息发出后接收延迟等等。
本来这次还想写文件传输和多人聊天室的,可惜实在来不及,以后如果有机会,希望能将这些功能补上去。

原文地址:https://www.cnblogs.com/wzt392217419/p/14329074.html