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

  • 相关阅读:
    poj 2763 Housewife Wind
    hdu 3966 Aragorn's Story
    poj 1655 Balancing Act 求树的重心
    有上下界的网络流问题
    URAL 1277 Cops and Thieves 最小割 无向图点带权点连通度
    ZOJ 2532 Internship 网络流求关键边
    ZOJ 2760 How Many Shortest Path 最大流+floyd求最短路
    SGU 438 The Glorious Karlutka River =) 拆点+动态流+最大流
    怎么样仿写已知网址的网页?
    5-10 公路村村通 (30分)
  • 原文地址:https://www.cnblogs.com/wzt392217419/p/14329074.html
Copyright © 2011-2022 走看看