文章目录

  • 概述
  • Phoenix5.0 shell 安装
  • Phoenix5.0 shell 使用
  • 增删改查
    • phoenix shell下创建view映射hbase表
    • 退出Phoenix
  • psql.py 执行外部SQL文件
    • 创建表
    • 导入数据
  • 复杂SQL:
    • 计数
    • 平均值
    • 聚合
  • SQuirrel客户端安装

概述

现有hbase的查询工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等。phoenix是一个在hbase上面实现的基于hadoop的OLTP技术,具有低延迟、事务性、可使用sql、提供jdbc接口的特点。 而且phoenix还提供了hbase二级索引的解决方案,丰富了hbase查询的多样性,继承了hbase海量数据快速随机查询的特点。但是在生产环境中,不可以用在OLTP中。在线事务处理的环境中,需要低延迟,而Phoenix在查询HBase时,虽然做了一些优化,但延迟还是不小。所以依然是用在OLAT中,再将结果返回存储下来。

Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。

环境说明:
hbase:2.1.5
springboot:2.1.1.RELEASE
hadoop :2.8.5
java: 8+
Phoenix:5.0.0

hadoop环境:Hadoop 2.8.5 完全分布式HA高可用安装(二)–环境搭建
hbase环境:hbase 2.1 环境搭建–完全分布式模式 Advanced - Fully Distributed

Phoenix5.0 shell 安装

官网:http://phoenix.apache.org/index.html

  • 下载
    到下载页面 http://phoenix.apache.org/download.html 下载最新的Phoenix5.0.0-HBase-2.0版本。
  • 上传解压安装包
    我们使用hbase 2.1 环境搭建–完全分布式模式 Advanced - Fully Distributed 文中搭建的hbase环境。将apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz上传到每一台机器,然后解压。我这里的目录是/data/program/apache-phoenix-5.0.0-HBase-2.0-bin
  • jar包拷贝
    phoenix-5.0.0-HBase-2.0-server.jar这个jar包拷贝到每一台机器的hbase的lib目录
cd /data/program/apache-phoenix-5.0.0-HBase-2.0-bin
cp phoenix-5.0.0-HBase-2.0-server.jar ../hbase-2.1.5/lib/
  • 重启hbase集群
cd /data/program/hbase-2.1.5/bin
./stop-hbase.sh
./start-hbase.sh

Phoenix5.0 shell 使用

验证是否部署成功,这里使用Phoenix提供的命令行工具。

cd /data/program/apache-phoenix-5.0.0-HBase-2.0-bin/bin[root@node4 bin]# ./sqlline.py node1,node2,node3:2181
Setting property: [incremental, false]
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix:node1,node2,node3:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:node1,node2,node3:2181
19/07/22 14:16:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connected to: Phoenix (version 5.0)
Driver: PhoenixEmbeddedDriver (version 5.0)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
133/133 (100%) Done
Done
sqlline version 1.2.0
0: jdbc:phoenix:node1,node2,node3:2181> !tables
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+-----------+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_COL_NAME  | REF_GENERATION  | INDEX_STATE  | IMMUTABLE_ROWS  | SALT_BUCKETS  | MULTI_TEN |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+-----------+
|            | SYSTEM       | CATALOG     | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
|            | SYSTEM       | FUNCTION    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
|            | SYSTEM       | LOG         | SYSTEM TABLE  |          |            |                            |                 |              | true            | 32            | false     |
|            | SYSTEM       | SEQUENCE    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
|            | SYSTEM       | STATS       | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+-----------+

可以看到Phoenix已经安装部署成功。
注意 ./sqlline.py node1,node2,node3:2181 后面跟的hbase使用的zk的地址。

!tables可以查看所有的表,这里列出来的表是上面再启动phoenix时创建的系统表。

phoenix语法:http://phoenix.apache.org/language/index.html

增删改查

下面演示一下创建表,插入语句,查询的操作。

0: jdbc:phoenix:node1,node2,node3:2181> create table person (id integer not null primary key,name varchar,age integer);
No rows affected (2.581 seconds)
0: jdbc:phoenix:node1,node2,node3:2181> upsert into person values (1,'zhangsan' ,18);
1 row affected (0.315 seconds)
0: jdbc:phoenix:node1,node2,node3:2181> select * from PERSON
. . . . . . . . . . . . . . . . . . . > ;
+-----+-----------+------+
| ID  |   NAME    | AGE  |
+-----+-----------+------+
| 1   | zhangsan  | 18   |
+-----+-----------+------+
1 row selected (0.237 seconds)

注意Phoenix是区分大小写的,默认列名表名会全部转为大写。如果想要小写需要使用双引号来标识。

我们在hbase shell 中查看一下Phoenix创建的表:

hbase(main):007:0> list
TABLE
PERSON
SYSTEM.CATALOG
SYSTEM.FUNCTION
SYSTEM.LOG
SYSTEM.MUTEX
SYSTEM.SEQUENCE
SYSTEM.STATS
test
8 row(s)
Took 0.0812 seconds
=> ["PERSON", "SYSTEM.CATALOG", "SYSTEM.FUNCTION", "SYSTEM.LOG", "SYSTEM.MUTEX", "SYSTEM.SEQUENCE", "SYSTEM.STATS", "test"]
hbase(main):008:0> scan 'PERSON'
ROW                                              COLUMN+CELL                                                                                                                                   \x80\x00\x00\x01                                column=0:\x00\x00\x00\x00, timestamp=1563776971049, value=x                                                                                   \x80\x00\x00\x01                                column=0:\x80\x0B, timestamp=1563776971049, value=zhangsan                                                                                    \x80\x00\x00\x01                                column=0:\x80\x0C, timestamp=1563776971049, value=\x80\x00\x00\x12
1 row(s)
Took 0.0541 seconds

上面PERSON表只有一个rowkey,有三列,默认列族名称是0,这里rowkey,列族和列都是Phoenix处理过的。
可以看到,hbase shell可以把Phoenix的表都列出来,而且都是可以操作的。

phoenix shell下创建view映射hbase表

一切正常,但是我们之前已经在hbase中通过hbase shell 创建了一个test表,这里没有展示,如何是好?

先看一下我们test表都有哪些数据

hbase(main):013:0> scan 'test'
ROW                                              COLUMN+CELL                                                                                                                                   row1                                            column=cf:a, timestamp=1563441734398, value=value1                                                                                            row1                                            column=cf:age, timestamp=1563779499842, value=12                                                                                              row2                                            column=cf:a, timestamp=1563451278532, value=value2a                                                                                           row2                                            column=cf:age, timestamp=1563779513308, value=13                                                                                              row2                                            column=cf:b, timestamp=1563441738877, value=value2                                                                                            row3                                            column=cf:c, timestamp=1563441741609, value=value3
3 row(s)

我们需要创建一个view来匹配原有的hbase创建的表

CREATE view "test" ("ROW" VARCHAR primary key, "cf"."a" VARCHAR, "cf"."b" VARCHAR, "cf"."c" VARCHAR, "cf"."age" SMALLINT
);

注意这里的age是SMALLINT,因为age序列化后只有两个字节。Phoenix与hbase数据类型映射比较苛刻,如果使用INTEGER会报错,因为INTEGER是4个字节。
读者可以试一下将age设置成INTEGER,会报错:Error: ERROR 201 (22000): Illegal data. Expected length of at least 4 bytes, but had 2 (state=22000,code=201)

Phoenix数据类型参考 http://phoenix.apache.org/language/datatypes.html

完整示例:

0: jdbc:phoenix:node1,node2,node3:2181> CREATE view "test" (
. . . . . . . . . . . . . . . . . . . >      "ROW" VARCHAR primary key,
. . . . . . . . . . . . . . . . . . . >      "cf"."a" VARCHAR,
. . . . . . . . . . . . . . . . . . . >      "cf"."b" VARCHAR,
. . . . . . . . . . . . . . . . . . . >      "cf"."c" VARCHAR,
. . . . . . . . . . . . . . . . . . . >      "cf"."age" SMALLINT
. . . . . . . . . . . . . . . . . . . > );
No rows affected (0.142 seconds)
0: jdbc:phoenix:node1,node2,node3:2181> !table
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+-----------+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_COL_NAME  | REF_GENERATION  | INDEX_STATE  | IMMUTABLE_ROWS  | SALT_BUCKETS  | MULTI_TEN |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+-----------+
|            | SYSTEM       | CATALOG     | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
|            | SYSTEM       | FUNCTION    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
|            | SYSTEM       | LOG         | SYSTEM TABLE  |          |            |                            |                 |              | true            | 32            | false     |
|            | SYSTEM       | SEQUENCE    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
|            | SYSTEM       | STATS       | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false     |
|            |              | PERSON      | TABLE         |          |            |                            |                 |              | false           | null          | false     |
|            |              | test        | VIEW          |          |            |                            |                 |              | false           | null          | false     |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+-----------+
0: jdbc:phoenix:node1,node2,node3:2181> select * from "test";
+-------+----------+---------+---------+---------+
|  ROW  |    a     |    b    |    c    |   age   |
+-------+----------+---------+---------+---------+
| row1  | value1   |         |         | -20174  |
| row2  | value2a  | value2  |         | -20173  |
| row3  |          |         | value3  | null    |
+-------+----------+---------+---------+---------+
3 rows selected (0.265 seconds)

虽然age使用SMALLINT进行映射不会报错,但是结果明显不是我们想要的结果,具体数据类型的对应后续在研究,这里先简单使用VARCHAR来映射。

删除视图:drop view "test"。重新创建视图:

0: jdbc:phoenix:node1,node2,node3:2181> drop view "test"
. . . . . . . . . . . . . . . . . . . > ;
No rows affected (0.013 seconds)
0: jdbc:phoenix:node1,node2,node3:2181> CREATE view "test" (
. . . . . . . . . . . . . . . . . . . >      "ROW" VARCHAR primary key,
. . . . . . . . . . . . . . . . . . . >      "cf"."a" VARCHAR,
. . . . . . . . . . . . . . . . . . . >      "cf"."b" VARCHAR,
. . . . . . . . . . . . . . . . . . . >      "cf"."c" VARCHAR,
. . . . . . . . . . . . . . . . . . . >      "cf"."age" VARCHAR
. . . . . . . . . . . . . . . . . . . > );
No rows affected (0.123 seconds)
0: jdbc:phoenix:node1,node2,node3:2181> select * from "test";
+-------+----------+---------+---------+------+
|  ROW  |    a     |    b    |    c    | age  |
+-------+----------+---------+---------+------+
| row1  | value1   |         |         | 12   |
| row2  | value2a  | value2  |         | 13   |
| row3  |          |         | value3  |      |
+-------+----------+---------+---------+------+
3 rows selected (0.384 seconds)

这样age展示就正常了。

退出Phoenix

命令:!exit

psql.py 执行外部SQL文件

创建表

除了上面直接使用命令行,也可以使用psql.py命令来操作外部文件,一些复杂的SQL和数据这样操作更加方便。

cd /data/program/apache-phoenix-5.0.0-HBase-2.0-bin/bin
./psql.py node1,node2,node3:2181 ../examples/WEB_STAT.sql

上面命令执行完成,就在Phoenix创建了一个表WEB_STAT 。../examples/WEB_STAT.sql是压缩包自带的demo:

CREATE TABLE IF NOT EXISTS WEB_STAT (HOST CHAR(2) NOT NULL,DOMAIN VARCHAR NOT NULL,FEATURE VARCHAR NOT NULL,DATE DATE NOT NULL,USAGE.CORE BIGINT,USAGE.DB BIGINT,STATS.ACTIVE_VISITOR INTEGERCONSTRAINT PK PRIMARY KEY (HOST, DOMAIN, FEATURE, DATE)
);

导入数据

命令:./psql.py -t WEB_STAT node1,node2,node3:2181 ../examples/WEB_STAT.csv

…/examples/WEB_STAT.csv 文件是数据文件,上面命令将其导入到表WEB_STAT 中。

[root@node4 bin]# cat ../examples/WEB_STAT.csv
NA,Salesforce.com,Login,2013-01-01 01:01:01,35,42,10
EU,Salesforce.com,Reports,2013-01-02 12:02:01,25,11,2
EU,Salesforce.com,Reports,2013-01-02 14:32:01,125,131,42
NA,Apple.com,Login,2013-01-01 01:01:01,35,22,40
NA,Salesforce.com,Dashboard,2013-01-03 11:01:01,88,66,44
NA,Salesforce.com,Login,2013-01-04 06:01:21,3,52,1
EU,Apple.com,Mac,2013-01-01 01:01:01,35,22,34
NA,Salesforce.com,Login,2013-01-04 11:01:11,23,56,45
EU,Salesforce.com,Reports,2013-01-05 03:11:12,75,22,3
EU,Salesforce.com,Dashboard,2013-01-06 05:04:05,12,22,43
EU,Salesforce.com,Reports,2013-01-05 04:14:12,475,252,53
NA,Google.com,Analytics,2013-01-07 06:01:01,23,1,57
NA,Apple.com,Mac,2013-01-02 04:01:01,345,255,155
NA,Google.com,Search,2013-01-08 08:01:01,345,242,46
NA,Salesforce.com,Login,2013-01-08 14:11:01,345,242,10
NA,Salesforce.com,Reports,2013-01-09 16:33:01,35,42,15
NA,Salesforce.com,Reports,2013-01-09 17:36:01,355,432,315
EU,Apple.com,Store,2013-01-03 01:01:01,345,722,170
NA,Salesforce.com,Login,2013-01-10 01:01:01,345,252,150
EU,Google.com,Search,2013-01-09 01:01:01,395,922,190
NA,Apple.com,Login,2013-01-04 01:01:01,135,2,110
NA,Salesforce.com,Dashboard,2013-01-11 01:01:01,335,32,30
NA,Apple.com,iPad,2013-01-05 01:01:01,85,2,18
EU,Salesforce.com,Login,2013-01-12 01:01:01,5,62,150
NA,Google.com,Search,2013-01-10 01:05:01,835,282,80
NA,Apple.com,iPad,2013-01-06 01:01:01,35,22,10
EU,Salesforce.com,Reports,2013-01-13 08:04:04,355,52,5
NA,Google.com,Analytics,2013-01-11 01:02:01,7,2,7
NA,Google.com,Search,2013-01-12 01:01:01,8,7,6
NA,Apple.com,iPad,2013-01-07 01:01:01,9,27,7
NA,Salesforce.com,Dashboard,2013-01-14 04:07:01,5,2,9
NA,Salesforce.com,Reports,2013-01-15 04:09:01,65,26,6
NA,Salesforce.com,Reports,2013-01-15 07:09:01,655,426,46
EU,Google.com,Analytics,2013-01-13 08:06:01,25,2,6
NA,Apple.com,Mac,2013-01-08 01:01:01,3,2,10
NA,Salesforce.com,Login,2013-01-16 01:01:01,785,782,80
NA,Google.com,Analytics,2013-01-14 01:01:01,65,252,56
NA,Salesforce.com,Login,2013-01-17 01:01:01,355,242,33
NA,Salesforce.com,Login,2013-01-17 02:20:01,1235,2422,243

执行查询:

0: jdbc:phoenix:node1,node2,node3:2181> select * from WEB_STAT;
+-------+-----------------+------------+--------------------------+-------+-------+-----------------+
| HOST  |     DOMAIN      |  FEATURE   |           DATE           | CORE  |  DB   | ACTIVE_VISITOR  |
+-------+-----------------+------------+--------------------------+-------+-------+-----------------+
| EU    | Apple.com       | Mac        | 2013-01-01 01:01:01.000  | 35    | 22    | 34              |
| EU    | Apple.com       | Store      | 2013-01-03 01:01:01.000  | 345   | 722   | 170             |
| EU    | Google.com      | Analytics  | 2013-01-13 08:06:01.000  | 25    | 2     | 6               |
| EU    | Google.com      | Search     | 2013-01-09 01:01:01.000  | 395   | 922   | 190             |
| EU    | Salesforce.com  | Dashboard  | 2013-01-06 05:04:05.000  | 12    | 22    | 43              |
| EU    | Salesforce.com  | Login      | 2013-01-12 01:01:01.000  | 5     | 62    | 150             |
| EU    | Salesforce.com  | Reports    | 2013-01-02 12:02:01.000  | 25    | 11    | 2               |
| EU    | Salesforce.com  | Reports    | 2013-01-02 14:32:01.000  | 125   | 131   | 42              |

复杂SQL:

计数

0: jdbc:phoenix:node1,node2,node3:2181> select count(1) from WEB_STAT;
+-----------+
| COUNT(1)  |
+-----------+
| 39        |
+-----------+
1 row selected (0.148 seconds)

平均值

0: jdbc:phoenix:node1,node2,node3:2181> select avg(core) from WEB_STAT;
+------------------+
| AVG(USAGE.CORE)  |
+------------------+
| 217.0769         |
+------------------+

聚合

0: jdbc:phoenix:node1,node2,node3:2181> select domain,count(1) c from WEB_STAT group by domain order by c ;
+-----------------+-----+
|     DOMAIN      |  C  |
+-----------------+-----+
| Google.com      | 8   |
| Apple.com       | 9   |
| Salesforce.com  | 22  |
+-----------------+-----+
3 rows selected (0.126 seconds)
0: jdbc:phoenix:node1,node2,node3:2181> select domain,count(1) c, avg(core),sum(db) from WEB_STAT group by domain order by c ;
+-----------------+-----+------------------+----------------+
|     DOMAIN      |  C  | AVG(USAGE.CORE)  | SUM(USAGE.DB)  |
+-----------------+-----+------------------+----------------+
| Google.com      | 8   | 212.875          | 1710           |
| Apple.com       | 9   | 114.1111         | 1076           |
| Salesforce.com  | 22  | 260.7272         | 5668           |
+-----------------+-----+------------------+----------------+
3 rows selected (0.247 seconds)

更多phoenix语法请参考官网:http://phoenix.apache.org/language/index.html

SQuirrel客户端安装

SQuirrel是一个图形化界面工具。由于Phoenix是一个JDBC驱动程序,因此与此类工具的集成是无缝的。通过SQuirrel,您可以在SQL选项卡中发出SQL语句(创建表,插入数据,运行查询),并在“对象”选项卡中检查表元数据(即列表,列,主键和类型)。

下载地址:http://squirrel-sql.sourceforge.net/#installation

下载下来是squirrel-sql-3.9.1-standard.jar
我们的hbase和hadoop等都是安装在虚拟机中的,这里squirrel客户端我们安装在宿主机Windows机器上。

使用命令java -jar squirrel-sql-3.9.1-standard.jar 进行安装,全部默认点击next即可。
安装完成后,默认是安装在C:\Program Files\squirrel-sql-3.9.1文件夹。

配置Phoenix客户端并启动

  • 配置Phoenix客户端jar包
    apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz中的phoenix-5.0.0-HBase-2.0-client.jarjar包拷贝到squirrel-sql-3.9.1\lib文件夹下。

然后双击squirrel-sql.bat 文件启动squirrel-sql-client

  • 配置驱动


这里name随便写,
URL填jdbc:phoenix:node1,node2,node3:2181,
className填org.apache.phoenix.jdbc.PhoenixDriver
点击OK保存。

  • 配置alias别名

    name随便写
    driver选刚才创建的驱动
    URL自动显示
    username和password是我们虚拟机登录密码
    auto logon 前面的复选框选中
    点击Test按钮测试链接是否可用
    点击OK按钮保存

之后进入squirrel-sql-client界面。


注意:SQL区分大小写,默认会转为大写,如果我们想要小写,需要加双引号。

Phoenix5.0 安装部署相关推荐

  1. MySQL 8.0 安装部署3个注意事项

    墨墨导读:本文分享实际案例中MySQL8.0安装部署时最典型的3个问题,希望对大家有帮助. MySQL 8.0 2016年首次发布,2018年GA版本发布也已经4年多的历程,最新版本已经到8.0.21 ...

  2. VMware-vRealize-Log-Insight-8.2.0.0安装部署指南

    VMware-vRealize-Log-Insight-8.2.0.0安装部署指南 https://blog.csdn.net/u011775882/article/details/110928142 ...

  3. linux上搭载was应用上传中文文件,受支持的Linux操作系统和WAS ND 9.0安装部署文档的资料说明...

    本文档的主要内容详细介绍的是受支持的Linux操作系统和WAS ND 9.0安装部署文档的资料说明. 从was9.0开始支持的最低版本的red hat Linux系统为6.6且仅支持64位操作系统 计 ...

  4. CentOS 8下 MySQL 8.0 安装部署(亲测)

    MySQL 8正式版8.0.11已发布,官方表示MySQL8要比MySQL 5.7快2倍,还带来了大量的改进和更快的性能!到底谁最牛呢?请看:MySQL 5.7 vs 8.0,哪个性能更牛? 下载地址 ...

  5. 记一次 基于Hadoop 3.3.0 安装部署 Spark 3.0.0 分布式集群

    一.基本信息 官网 http://spark.apache.org/ Apache Spark 官方文档中文版(Spark 2.2.0) http://spark.apachecn.org/#/ Sp ...

  6. fuel6.0安装部署

    在经过一系列安装openstack方式后,个人觉得fuel的安装方式相对简易,接下来记录下安装部署fuel6.0的过程.本教程适合想把fuel6.0部署后,云主机需要连接外网的需求. 安装virtua ...

  7. vCenter 6.0安装部署

    本文主要测试vCenter 6.0的安装部署,vCenter6.0的坑爹之处是要8G内存才能安装,加上ESXi6.0需要至少4G内存,让我不得不买了2条8G的笔记本内存条,否则都无法完成这个测试.后面 ...

  8. centos7 安装mysql8_CentOS 下 MySQL 8.0 安装部署,超详细!

    MySQL 8正式版8.0.11已发布,官方表示MySQL8要比MySQL 5.7快2倍,还带来了大量的改进和更快的性能!到底谁最牛呢?请看:MySQL 5.7 vs 8.0,哪个性能更牛? Mysq ...

  9. mysql8.0版本的服务器名称_MySQL 8.0安装部署-运维笔记

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 一.  Mysql8.0版本相比之前版本的一些特性 1) ...

最新文章

  1. 服务器返回的常见的http状态码
  2. VNC轻松连接远程Linux桌面
  3. JAVA_OA(六):SpringMVC登陆实例
  4. @即将开学的你,请收好这份必读论文清单
  5. 单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作...
  6. c语言备忘录算法矩阵链乘,矩阵链乘法(备忘录法)
  7. 常用控件 winform
  8. Linux中apt install的lock问题
  9. java jws-_为JWS应用程序启动指定JRE位置
  10. Java并发(五)——锁
  11. fields and vector spaces
  12. 两个文本框异动任何一个能即时更新计算结果
  13. POJ 2377 Bad Cowtractors
  14. HTML制作简单的个人简历网页
  15. 揭秘IBM架构设计方法论 —— Solution Design II
  16. 如何在Ubuntu下使用全民wifi?
  17. 项目记录-手机号码限制频次
  18. 分享即时通讯开发之实时音视频技术基础知识
  19. 诗词大全给力版_热卖20万套的网红古诗词日历来了!全新开启2021诗意生活
  20. 什么是面向对象?面向对象的特征?面向对象和面向过程的区别?

热门文章

  1. Android底部动画弹窗Dialog
  2. win平台下Path变量消失问题
  3. 使用turtle库绘制分形树、太阳花、五角星
  4. 期货投资中的几大策略
  5. java中asscc码表,RedHat Linux各版本汇总
  6. JAVA编写企业微信定时发消息
  7. FSC® COC森林认证将增加ILO劳工要求标准
  8. iOS开发用Eventkit向日历和提醒事项中加入事件和闹铃
  9. Python开发学习之Python和Excel的数据实现互通
  10. mysql gbk_MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题