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

  • 相关阅读:
    第一堂课20210302
    第一堂课20210301
    第一堂课20210301
    实验2-3-1 求1到100的和 (10分)
    实验2-3-2 求N分之一序列前N项和 (15分)
    实验2-3-3 求奇数分之一序列前N项和 (15分)
    实验2-3-4 求简单交错序列前N项和 (15分)
    实验2-3-5 输出华氏-摄氏温度转换表 (15分)
    实验2-3-6 求交错序列前N项和 (15分)
    实验2-3-7 求平方与倒数序列的部分和 (15分)
  • 原文地址:https://www.cnblogs.com/wzt392217419/p/14329074.html
Copyright © 2020-2023  润新知