From 0a9d6edb9b9b8603a4a7b06b25da7fb965f9b699 Mon Sep 17 00:00:00 2001 From: wangran <3189505710@qq.com> Date: Tue, 13 Jan 2026 19:59:17 +0800 Subject: [PATCH] =?UTF-8?q?2026.1.13=E6=8F=90=E4=BA=A4=EF=BC=8Cjyt?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/codeStyles/codeStyleConfig.xml | 5 + .../com/bigdata/config/MultiPortConfig.java | 46 ++++++ .../bigdata/controller/PhoenixController.java | 41 ++++++ .../com/bigdata/util/PhoenixJdbcUtil.java | 139 ++++++++++++++++++ src/main/resources/application.yml | 1 + 5 files changed, 232 insertions(+) create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 src/main/java/com/bigdata/config/MultiPortConfig.java create mode 100644 src/main/java/com/bigdata/controller/PhoenixController.java create mode 100644 src/main/java/com/bigdata/util/PhoenixJdbcUtil.java diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/src/main/java/com/bigdata/config/MultiPortConfig.java b/src/main/java/com/bigdata/config/MultiPortConfig.java new file mode 100644 index 0000000..2559c8c --- /dev/null +++ b/src/main/java/com/bigdata/config/MultiPortConfig.java @@ -0,0 +1,46 @@ +package com.bigdata.config; + +import org.apache.coyote.http11.Http11NioProtocol; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MultiPortConfig { + + // 读取配置文件中的额外端口(8080) + @Value("${server.additional-ports:}") + private String additionalPorts; + + @Bean + public WebServerFactoryCustomizer webServerFactoryCustomizer() { + return factory -> { + if (additionalPorts != null && !additionalPorts.trim().isEmpty()) { + for (String portStr : additionalPorts.split(",")) { + int port = Integer.parseInt(portStr.trim()); + // 修正构造函数:先实例化 Http11NioProtocol,再传入 Connector + factory.addAdditionalTomcatConnectors(createConnector(port)); + } + } + }; + } + + // 重构 Connector 创建逻辑,适配 Tomcat 9.x + private org.apache.catalina.connector.Connector createConnector(int port) { + // 1. 先实例化 HTTP 协议对象 + Http11NioProtocol protocol = new Http11NioProtocol(); + // 2. 设置协议的端口 + protocol.setPort(port); + + // 3. 创建 Connector 并传入实例化的协议对象(Tomcat 9.x 正确写法) + org.apache.catalina.connector.Connector connector = new org.apache.catalina.connector.Connector(protocol); + // 4. 补充必要配置 + connector.setPort(port); // 绑定端口 + connector.setScheme("http"); // HTTP 协议 + connector.setSecure(false); // 非 HTTPS + connector.setURIEncoding("UTF-8");// 编码格式 + return connector; + } +} \ No newline at end of file diff --git a/src/main/java/com/bigdata/controller/PhoenixController.java b/src/main/java/com/bigdata/controller/PhoenixController.java new file mode 100644 index 0000000..06aef63 --- /dev/null +++ b/src/main/java/com/bigdata/controller/PhoenixController.java @@ -0,0 +1,41 @@ +package com.bigdata.controller; + +import com.bigdata.util.PhoenixJdbcUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; +import java.util.Map; + +/** + * 测试控制器:读取 NWQUALITY 表数据并返回 + */ +@RestController +@RequestMapping("/phoenix") +public class PhoenixController { + + // 注入工具类 + @Autowired + private PhoenixJdbcUtil phoenixJdbcUtil; + + /** + * 读取 NWQUALITY 表所有数据 + * 访问地址:http://localhost:8080/phoenix/nwquality/all + */ + @GetMapping("/nwquality/all") + public List> getAllNWQualityData() { + return phoenixJdbcUtil.readNWQualityData(); + } + + /** + * 读取 NWQUALITY 表指定列数据(示例:id 和 value 列) + * 访问地址:http://localhost:8080/phoenix/nwquality/columns + */ + @GetMapping("/nwquality/columns") + public List> getSpecifiedColumns() { + // 替换成你实际需要查询的列名 + String columns = "id, quality_value, create_time"; + return phoenixJdbcUtil.readNWQualityData(columns); + } +} \ No newline at end of file diff --git a/src/main/java/com/bigdata/util/PhoenixJdbcUtil.java b/src/main/java/com/bigdata/util/PhoenixJdbcUtil.java new file mode 100644 index 0000000..f7027ff --- /dev/null +++ b/src/main/java/com/bigdata/util/PhoenixJdbcUtil.java @@ -0,0 +1,139 @@ +package com.bigdata.util; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Phoenix JDBC 操作工具类 + * 用于读取 HBase 中 NWQUALITY 表数据 + */ +@Component +public class PhoenixJdbcUtil { + + // 从配置文件读取 Phoenix 连接 URL + @Value("${spring.datasource.url}") + private String phoenixUrl; + + // Phoenix 驱动类名(固定) + private static final String PHOENIX_DRIVER = "org.apache.phoenix.jdbc.PhoenixDriver"; + + /** + * 读取 NWQUALITY 表的所有数据 + * @return 表数据列表,每个元素是一行数据的键值对 + */ + public List> readNWQualityData() { + // 结果集容器 + List> resultList = new ArrayList<>(); + Connection conn = null; + Statement stmt = null; + ResultSet rs = null; + + try { + // 1. 加载 Phoenix 驱动 + Class.forName(PHOENIX_DRIVER); + // 2. 建立连接(Phoenix 无需用户名密码) + conn = DriverManager.getConnection(phoenixUrl); + // 3. 创建 Statement + stmt = conn.createStatement(); + + // 4. 执行查询 SQL(查询 NWQUALITY 表所有数据) + // 注意:Phoenix 表名/列名默认区分大小写,若表名是小写需用双引号包裹 + String sql = "SELECT * FROM NWQUALITY"; + rs = stmt.executeQuery(sql); + + // 5. 获取结果集的元数据(列名、列数) + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + + // 6. 解析结果集,封装成 Map 列表 + while (rs.next()) { + Map rowMap = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) { + // 获取列名和列值 + String columnName = metaData.getColumnName(i); + Object columnValue = rs.getObject(i); + rowMap.put(columnName, columnValue); + } + resultList.add(rowMap); + } + + System.out.println("成功读取 NWQUALITY 表数据,共 " + resultList.size() + " 行"); + + } catch (ClassNotFoundException e) { + System.err.println("Phoenix 驱动加载失败:" + e.getMessage()); + throw new RuntimeException("Phoenix 驱动加载失败", e); + } catch (SQLException e) { + System.err.println("JDBC 操作失败:" + e.getMessage()); + System.err.println("请检查:1. hadoop102 的 ZooKeeper 是否启动 2. NWQUALITY 表是否存在 3. 网络是否可达"); + throw new RuntimeException("读取 NWQUALITY 表数据失败", e); + } finally { + // 7. 关闭资源(逆序关闭) + try { + if (rs != null) rs.close(); + if (stmt != null) stmt.close(); + if (conn != null) conn.close(); + } catch (SQLException e) { + System.err.println("关闭 JDBC 资源失败:" + e.getMessage()); + } + } + + return resultList; + } + + /** + * 重载方法:读取 NWQUALITY 表的指定列数据 + * @param columns 要查询的列名(如 "id, name, value") + * @return 指定列的表数据 + */ + public List> readNWQualityData(String columns) { + List> resultList = new ArrayList<>(); + Connection conn = null; + Statement stmt = null; + ResultSet rs = null; + + try { + Class.forName(PHOENIX_DRIVER); + conn = DriverManager.getConnection(phoenixUrl); + stmt = conn.createStatement(); + + // 执行指定列的查询 + String sql = String.format("SELECT %s FROM NWQUALITY", columns); + rs = stmt.executeQuery(sql); + + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + + while (rs.next()) { + Map rowMap = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) { + String columnName = metaData.getColumnName(i); + Object columnValue = rs.getObject(i); + rowMap.put(columnName, columnValue); + } + resultList.add(rowMap); + } + + System.out.println("成功读取 NWQUALITY 表[" + columns + "]列数据,共 " + resultList.size() + " 行"); + + } catch (Exception e) { + System.err.println("读取指定列数据失败:" + e.getMessage()); + throw new RuntimeException(e); + } finally { + // 关闭资源 + try { + if (rs != null) rs.close(); + if (stmt != null) stmt.close(); + if (conn != null) conn.close(); + } catch (SQLException e) { + System.err.println("关闭资源失败:" + e.getMessage()); + } + } + + return resultList; + } +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b09c23f..8bedc86 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,5 +1,6 @@ server: port: 8081 + additional-ports: 8080 spring: mvc: