JAVA 实践项目 --- 树莓派信息自动化采集后入库项目 (五)

本贴最后更新于 2013 天前,其中的信息可能已经时移俗易

项目源代码可访问我的 github:https://github.com/Spacider/Gather-and-store
如果觉得好的话请给个 star 哦~

开发 IDE: IDEA 2018.03 JDK 1.8
开发环境: macOS 10.13.6 (如 windows 请对项目中部分路径进行改写)
数据库: Oracle 11g


第四阶段:发送给我们的服务端,并进行入库操作

这一阶段我们的任务就是接收上节客户端发送的对象数据,并且在分析以后把数据写入数据库!

imagepng

此层项目结构为:
imagepng


接下来,看代码:
1.编写一个 EnvServer 接口,其中有个抽象方法,作用就是接收各个客户端发送过来的集合对象:

/**
 * 服务器端模块
 */
public interface EnvServer extends WossModel  {
    /**
     * 接收各个客户端发送过来的集合对象 Collection(Environment)
     */
    void receive();
}

新创建一个实现包为 Impl ,创建实现类 EnvServerImpl,其中实现了 receive 方法,在写 receive 方法之前,我们先定义一个线程来接收,运用线程可以很好的体现"持续性"读取的特点。

class EnvServerThread extends Thread {

    private Socket socket;
    public EnvServerThread (Socket socket){
        this.socket = socket;
    }
}

使用构造器把 socket 对象传入!这样我们就可以在线程类中操作流来接收我们需要的数据了!

is = socket.getInputStream();
ois = new ObjectInputStream(is);
List <Environment> environmentList = (List <Environment>) ois.readObject();

获取到我们的输入流时,直接将其包装成对象流(上文发过来的时候使用对象流发送),故我们可以通过 readObject 方法来得到我们上文从客户端发过来的对象!

之后 receive 方法可以这么写:

/**
     * 服务器接收方法
     */
    public void receive() {
        Socket socket = null;

        try {
            ServerSocket server = new ServerSocket(port);
            logger.info("server 启动"+ server);
            while(true){
                socket = server.accept();
                new EnvServerThread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

运行 EnvServerImpl 类和 ClientMain 类和 DataServer 类,在服务端的线程中打印对象数组,在看见数组并且数组正确时,就说明你这一部分写对了!


2.在获得对象以后我们需要对数组进行入库操作:
编写接口

/**
 * 入库模块
 */
public interface DBStore extends WossModel {
    /**
     * 把服务器接收到的数据写入到数据库中持久保存
     * 注意数据的录入是按天进行录入的
     * t_s ---> 拆分成多张表
     * 20/5 取余数
     * t_s0 t_s1 t_s2 t_s3 t_s4
     * @param col
     */
    void saveEnvToDB(Collection<Environment> col);
}

数据库操作自然会用到 jdbc!为了方便编写一个数组库的操作类,里边包含各种关于数据库的操作:
此处,请记得修改你的文件路径,第二记得修改文件中的内容,修改为你对应数据库的链接信息!
这个和一般网上所写的都差不多,就直接贴代码了:

/**
 * 数据库处理帮助类
 * 书写关于数据库的一些操作方法,比如 获取连接对象 、 封装插入方法
 */
public class DBhelper {

    // dhcp 缓冲池对象
    private static BasicDataSource DATA_SOURCE;

    static {
        Properties properties = new Properties();
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(new File("/Users/wjh/Desktop/FirstProject/src/main/resources/config.properties"));
            properties.load(fis);

            // 通过读取 properties 文件来初始化 DATA_SOURCE
            DATA_SOURCE = new BasicDataSource();
            DATA_SOURCE = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtil.close(fis);
        }
    }

    /**
     * 获取 Connection 连接对象
     * @return
     */
    public static Connection getConnction(){
        Connection connection = null;
        try {
            connection = DATA_SOURCE.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 处理 SQL 语句方法
     * @param sql
     */
    public static void ExecuteSql(String sql){
        Connection connection = getConnction();
        PreparedStatement ps = null;

        try {
            ps = connection.prepareStatement(sql);
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ps != null) {
                    ps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

之后我们就可以写入库的实现类 DBStoreImpl
通过我们刚才写的数据库操作类来获得一个数据库链接:

 Connection connection = DBhelper.getConnction();

之后就是对对象的拆分并通过 PreparedStatement 来对 sql 语句进行预加载,把对应的数据存入:

for (Environment environment : col) {
                DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
                Timestamp timestamp = environment.getGather_date();
                String tsStr = sdf.format(timestamp);
                // gather_date=2018-09-15 11:17:48.0

                String[] time = tsStr.split("\\-");
                String day = time[2];

                // 拼接 sql 语句
                String sql = "insert into T_DETAIL_" + day
                        + " values(?,?,?,?,?,?,?,?,?,?)";

                ps = connection.prepareStatement(sql);

                ps.setString(1,environment.getName());
                ps.setString(2,environment.getSrcID());
                ps.setString(3,environment.getDstID());
                ps.setString(4,environment.getDevID());
                ps.setString(5,environment.getSensorAddress());
                ps.setInt(6,environment.getCount());
                ps.setInt(7,environment.getCmd());
                ps.setString(8,environment.getData()+"");
                ps.setInt(9,environment.getStatus());
                ps.setTimestamp(10,environment.getGather_date());

接下来是对数组运行的处理,这里采用了缓存机制,等待 count 为 100 条的整数倍时再运行响应的 sql 语句,当 sql 语句较多时可以减少大量 sql 等待的场景。

ps.addBatch();

if ( count % 100 == 0 ) {
      ps.executeBatch();
  }
  count ++;

实现了入库的操作之后在 EnvServerImpl 类的线程类中加入如下一行,
把数据递交给入库类处理:

// 数据库入库操作
dbStore.saveEnvToDB(environmentList);

最后,运行 EnvServerImpl 类和 ClientMain 类和 DataServer 类,看到提示信息,并发现数据库内有我们需要的数据的时候,就完成了当前部分的编写!

  • 实践项目
    6 引用
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 导航

    各种网址链接、内容导航。

    37 引用 • 168 回帖 • 2 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 177 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 35 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 152 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 3 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖 • 1 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 627 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 145 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 7 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 37 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 6 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 522 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 621 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 511 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 192 关注
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 178 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖 • 1 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    273 引用 • 679 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 35 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖 • 1 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注