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

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

项目源代码可访问我的 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 13 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 24 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 688 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 112 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖 • 2 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 686 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 450 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 566 关注
  • 叶归
    15 引用 • 66 回帖 • 28 关注
  • Java

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

    3203 引用 • 8217 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 2 关注
  • Follow
    4 引用 • 12 回帖 • 11 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 677 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 507 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 2 关注
  • 运维

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

    151 引用 • 257 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 229 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    555 引用 • 675 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖 • 1 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    498 引用 • 934 回帖 • 1 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 3 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 92 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 237 关注