提交 b8dcfc4e 编写于 作者: 小傅哥's avatar 小傅哥

小傅哥,feat:ignite

上级
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
/data/
/ignite/
/xfg-dev-tech-app/data/
/xfg-dev-tech-app/ignite/
# 命令执行 docker-compose up -d
version: '3.9'
# 不同架构选择不同镜像;AMD ignite:2.15.0 ARM ignite:2.15.0-arm64 https://hub.docker.com/r/apacheignite/ignite/tags
# mysql 8.0.32 支持 AMD/ARM
services:
mysql:
image: mysql:8.0.32
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
TZ: Asia/Shanghai
# MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' # 可配置无密码,注意配置 SPRING_DATASOURCE_PASSWORD=
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: xfg
MYSQL_PASSWORD: 123456
depends_on:
- mysql-job-dbdata
ports:
- "13306:3306"
volumes:
- ./mysql:/docker-entrypoint-initdb.d
volumes_from:
- mysql-job-dbdata
# 自动加载数据
mysql-job-dbdata:
image: alpine:3.18.2
container_name: mysql-job-dbdata
volumes:
- /var/lib/mysql
ignite:
image: apacheignite/ignite:2.15.0
container_name: ignite
ports:
- 10800:10800
# ab -n 1000 -c 100 https://baidu.com/
ApacheBench:
image: anantadwi13/rakyll-hey
\ No newline at end of file
# 命令执行 docker-compose up -d
version: '3.9'
# 不同架构选择不同镜像;AMD ignite:2.15.0 ARM ignite:2.15.0-arm64 https://hub.docker.com/r/apacheignite/ignite/tags
# mysql 8.0.32 支持 AMD/ARM
services:
mysql:
image: mysql:8.0.32
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
TZ: Asia/Shanghai
# MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' # 可配置无密码,注意配置 SPRING_DATASOURCE_PASSWORD=
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: xfg
MYSQL_PASSWORD: 123456
depends_on:
- mysql-job-dbdata
ports:
- "13306:3306"
volumes:
- ./mysql:/docker-entrypoint-initdb.d
volumes_from:
- mysql-job-dbdata
# 自动加载数据
mysql-job-dbdata:
image: alpine:3.18.2
container_name: mysql-job-dbdata
volumes:
- /var/lib/mysql
ignite:
image: apacheignite/ignite:2.15.0-arm64
container_name: ignite
ports:
- 10800:10800
# ab -n 1000 -c 100 https://baidu.com/
ApacheBench:
image: anantadwi13/rakyll-hey
\ No newline at end of file
-- PUBLIC.USER_ORDER definition
-- Drop table
-- DROP TABLE PUBLIC.USER_ORDER;
CREATE TABLE PUBLIC.USER_ORDER (
ID BIGINT,
USER_NAME VARCHAR(64) NOT NULL,
USER_ID VARCHAR(24) NOT NULL,
USER_MOBILE VARCHAR(20) NOT NULL,
SKU VARCHAR(64) NOT NULL,
SKU_NAME VARCHAR(128) NOT NULL,
ORDER_ID VARCHAR(64) NOT NULL,
QUANTITY INTEGER NOT NULL,
UNIT_PRICE DECIMAL(10,2) NOT NULL,
DISCOUNT_AMOUNT DECIMAL(10,2),
TAX DECIMAL(4,2) NOT NULL,
TOTAL_AMOUNT DECIMAL(10,2) NOT NULL,
ORDER_DATE TIMESTAMP NOT NULL,
ORDER_STATUS TINYINT NOT NULL,
IS_DELETE TINYINT NOT NULL,
UUID VARCHAR(128) NOT NULL,
IPV4 VARCHAR(128) NOT NULL,
IPV6 VARCHAR(128) NOT NULL,
EXT_DATA VARCHAR(256),
UPDATE_TIME TIMESTAMP NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL,
CONSTRAINT ID PRIMARY KEY (ID)
);
\ No newline at end of file
# ************************************************************
# Sequel Ace SQL dump
# 版本号: 20050
#
# https://sequel-ace.com/
# https://github.com/Sequel-Ace/Sequel-Ace
#
# 主机: localhost (MySQL 8.0.32)
# 数据库: road_map
# 生成时间: 2023-08-13 10:25:48 +0000
# ************************************************************
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8mb4;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
# 转储表 user_order
# ------------------------------------------------------------
CREATE database if NOT EXISTS `road_map` default character set utf8mb4 collate utf8mb4_0900_ai_ci;
use `road_map`;
DROP TABLE IF EXISTS `user_order`;
CREATE TABLE `user_order` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。',
`user_name` varchar(64) NOT NULL COMMENT '用户姓名;',
`user_id` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户编号;',
`user_mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户电话;使用varchar(20)存储手机号,不要使用整型。手机号不会做数学计算、涉及到区号或者国家代号,可能出现+-()、支持模糊查询,例如:like“135%”',
`sku` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品编号',
`sku_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
`order_id` varchar(64) NOT NULL COMMENT '订单ID',
`quantity` int NOT NULL DEFAULT '1' COMMENT '商品数量;整形定义中不显示规定显示长度,比如使用 INT,而不使用 INT(4)',
`unit_price` decimal(10,2) NOT NULL COMMENT '商品价格;小数类型为 decimal,禁止使用 float、double',
`discount_amount` decimal(10,2) NOT NULL COMMENT '折扣金额;',
`tax` decimal(4,2) NOT NULL COMMENT '费率金额;',
`total_amount` decimal(10,2) NOT NULL COMMENT '支付金额;(商品的总金额 - 折扣) * (1 - 费率)',
`order_date` datetime NOT NULL COMMENT '订单日期;timestamp的时间范围在1970-01-01 00:00:01到2038-01-01 00:00:00之间',
`order_status` tinyint(1) NOT NULL COMMENT '订单状态;0 创建、1完成、2掉单、3关单 【不要使用 enum 要使用 tinyint 替代。0-80 范围,都可以使用 tinyint】',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】',
`uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用',
`ipv4` int unsigned NOT NULL DEFAULT '2130706433' COMMENT '设备地址;存储IPV4地址,通过MySQL 函数转换,inet_ntoa、inet_aton 示例;SELECT INET_ATON(‘209.207.224.40′); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40所有字段定义为NOT NULL,并设置默认值,因为null值的字段会导致每一行都占用额外存储空间\\n数据迁移容易出错,在聚合函数计算结果偏差(如count结果不准)并且null的列使索引/索引统计/值比较都更加复杂,MySQL内部需要进行特殊处理,表中有较多空字段的时候,数据库性能下降严重。开发中null只能采用is null或is not null检索,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’abc’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录',
`ipv6` varbinary(16) NOT NULL COMMENT '设备地址;存储IPV6地址,VARBINARY(16) 插入:INET6_ATON(''2001:0db8:85a3:0000:0000:8a2e:0370:7334'') 查询:SELECT INET6_NTOA(ip_address) ',
`ext_data` json NOT NULL COMMENT '扩展数据;记录下单时用户的设备环境等信息(核心业务字段,要单独拆表)。【select user_name, ext_data, ext_data->>''$.device'', ext_data->>''$.device.machine'' from `user_order`;】',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_orderid` (`order_id`),
UNIQUE KEY `uq_uuid` (`uuid`),
KEY `idx_order_date` (`order_date`),
KEY `idx_sku_unit_price_total_amount` (`sku`,`unit_price`,`total_amount`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
LOCK TABLES `user_order` WRITE;
/*!40000 ALTER TABLE `user_order` DISABLE KEYS */;
INSERT INTO `user_order` (`id`, `user_name`, `user_id`, `user_mobile`, `sku`, `sku_name`, `order_id`, `quantity`, `unit_price`, `discount_amount`, `tax`, `total_amount`, `order_date`, `order_status`, `is_delete`, `uuid`, `ipv4`, `ipv6`, `ext_data`, `update_time`, `create_time`)
VALUES
(1,'小傅哥','U001','13512345678','SKU001','Mac Pro M2 贴膜','ORD001',2,10.99,2.00,0.50,19.48,'2023-08-12 10:00:00',0,0,'uuid001',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-08-12 10:00:00','2023-08-12 10:00:00'),
(2,'福禄娃','U002','13698765432','SKU002','IPad mini4 外套','ORD002',1,25.99,0.00,1.50,24.49,'2023-08-12 11:30:00',1,0,'uuid002',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"PC Windows\", \"location\": \"BeiJing\"}}','2023-08-12 11:30:00','2023-08-12 11:30:00'),
(3,'拎瓢冲','U003','13755555555','SKU003','数据线','ORD003',3,9.99,1.50,0.00,26.97,'2023-08-12 13:45:00',0,0,'uuid003',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"PC Windows\", \"location\": \"BeiJing\"}}','2023-08-12 13:45:00','2023-08-12 13:45:00'),
(4,'熏5null','U004','13812345678','SKU004','U盘','ORD004',1,15.99,0.00,0.75,15.24,'2023-08-12 14:20:00',1,0,'uuid004',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"PC Windows\", \"location\": \"BeiJing\"}}','2023-08-12 14:20:00','2023-08-12 14:20:00'),
(5,'温柔一刀','U005','13999999999','SKU005','坐垫','ORD005',2,12.50,1.25,0.25,23.75,'2023-08-12 15:55:00',0,0,'uuid005',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"PC Windows\", \"location\": \"BeiJing\"}}','2023-08-12 15:55:00','2023-08-12 15:55:00'),
(9,'小傅哥','U001','13512345678','SKU001','Mac Pro M2 贴膜','ORD0101',2,10.99,2.00,0.50,19.48,'2023-08-12 10:00:00',0,0,'uuid010',2130706433,X'20010DB885A3000000008A2E03707334','{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}','2023-08-12 10:00:00','2023-08-12 10:00:00');
/*!40000 ALTER TABLE `user_order` ENABLE KEYS */;
UNLOCK TABLES;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
<mxfile host="Electron" modified="2023-09-12T09:35:47.229Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.2.8 Chrome/102.0.5005.167 Electron/19.0.15 Safari/537.36" etag="bVcagXiHt17fstZa668a" version="20.2.8" type="device"><diagram id="OfueGv3TDxaJoiHR6Bu8" name="第 1 页">5Vlbb9s2FP41ArYHG7pYsvwo37YUCdDC7bbuZaAkylYqiQ5FJ3Z//Q4vulmSmzRW1qFFUJEfLzo8/L7DQ1mzFunxN4r2uzsS4kQz9fCoWUvNNA3TmsCDIyeJTN2ZBLY0DiWkV8Am/orVyAI9xCHOFSYhRkjC4n0TDEiW4YA1MEQpeWp2i0gSNoA92uIWsAlQ0kb/jEO2k+hM1yv8dxxvd8WbnaIlRUVnBeQ7FJKnGmStNGtBCWGylB4XOOHOa/pl3dNaGkZxxp4z4Nb9+4+b8ObDaoQCfTp6732aP4wMSxnHTsWKcQgOUFVC2Y5sSYaSVYXOKTlkIebT6lCr+twSsgfQAPAeM3ZSu4kOjAC0Y2miWvExZn/Vyp/5VGNb1ZZHNbOonIpKxuipHMQrtVG8Wg0TtWJcRDKmDDEmUJfr5Yvs9aOCcnKgAb7kPMVHRLeYXehnlbsNMsEkxWAfjKM4QSx+bNqBFF+3ZT811KMUnWod9iTOWF6b+T0HoIOSXklEJTzgbJMe3+hvTxr9oSAtKGq1pVSQoNxL6KeiwyNKDsoPmukkTO1bg5jOw4EUDaNc7KgHHQxrfxTbWrRDaSueK1tzPc3TtZWrzZf8jyNTbe6ZvOTZ2myqrRxtZmtznRfcpeateGHuadxb0hBYmLRFTdull1vkQ9xrcBwl8TaDcgC0whSAR0xZDIHFUw1pHIZSThhWg3wxH2es2lmY3J5r9vKMw46qr1EaJ3yvFiSNAzBpgzKgg363KY3kb8RHrSNMqrdVwalO/wuBok1iNf1IH+vmVAWTlxG7YuKpcwCJohzk1eTiddjXS74wfuzkno+CL1sR/kYBSQiVFKRb/xfTtjUTzNDrhV/FVuhnXV3ZXjxUJ0HrSG0q7wpvRSnE07l69zvM5hTFcpNJRs7b5XQptOR7xONWOWslltnY3bNutaiVw9isc+nVIixdtyzf6pwGqB0zPA4RQyp8ViqSU6vX8Ylki08rG3S57mtYcqDJpXfr96EfQEkaDAW2izPRsoY/w5yOgdFjQ1QHtTOkoBQ6ChKU56MMpRc9phO6HSPY3h0eK1ffiMc7WM1HWMFSzNZlch/SR/W3Zk56yh+S/xFxhL0lYRICkX1HcujmGZalO4BRgsJ/UgQSXR9yvNncgjERSnJcKlf+n2MKe/YxTvFXknGLP31cDL1GeOc3uSZS02Ht2APpnwgNL9rBLxG280PJMCDpWBI2uB9zQoybwoNBQldNhZyjZ4lElVbz/OFpB7LeyEi+fKKcRo30ggYqI7BryUaCo2rqjuO/leX2HujuWfZYZIdP1SVoUvTZ1S9ABdh13jcO8Jee1mbvae2fO1rljhEKmlRop0o1Hjwj1XR6Us1Tyq3XVjPNtXkWuZrybBNySViSPF9WlgaOcQ0ZNfoyyxL2e0kCO8qGSzT5VS1XiSbXFKPkC15IAS0zEZ3mUZwkZ9AV+DZt8s2YtvlWcrDON2soulkddLuOYA1jEIlOJs+UaOnHq/us/zbXH51huew8mbYNmcxWz+5Murdfn3Ahf9rvuPgFLD8H6FxSI6UiTxiJKKs18XlGKLw/iNOd+01+0IDSd90H+hIov9NB/f2/K8rJKZaQZm1EmrUgWRRvRfRy+eXY8/jdeA4BzBB34yW/J/N4ttBmjrhAAzh7UQTrPkd/lsB2rlKjI7DZbxnYDKPl+zf85Fd95vtca+n+5Dfgp7vpMz/dzV756e5VOzVthVN52XvdQXTu1TrtRY7sIr3wfg2PxL+WdsQIeypGXEEthnkml1lbLmVu0Mg7BzvUjPbB//PpxX2mXgy9e3vfRjBuSzB3p82H20H1YvjIwObL9OKsvPV19GJNfji9zHqj1voO7ff8kjzgdoQ2dsNJl9td07ccZ5gw5fz3bi/yijb538TtCLtR0OV2J3CxHw3D9kHdLr7gFT/Oyp8cqp+4rdW/</diagram></mxfile>
\ No newline at end of file
<mxfile host="Electron" modified="2023-09-12T09:36:03.663Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.2.8 Chrome/102.0.5005.167 Electron/19.0.15 Safari/537.36" etag="3qAWdjsMD2H6ImbE1g0Y" version="20.2.8" type="device"><diagram id="OfueGv3TDxaJoiHR6Bu8" name="第 1 页">5Vnbcts2EP0azrQP0vAiUtQjdWudsWeSUdI2femAJCjRIQkZhGwpX9/FhTeRVOxYdNNJxhMCiwWwWJyzWECatUiPv1G0392RECeaqYdHzVpqpmmY1gQ+XHKSkqk7k4ItjUMp0ivBJv6KVc9CeohDnCuZFDFCEhbvm8KAZBkOWEOGKCVPTbWIJGFDsEdb3BJsApS0pX/GIdtJ6UzXK/nvON7uipmdoiVFhbIS5DsUkqeayFpp1oISwmQpPS5wwp3X9Mu6p7U0jOKMPafDrfv3HzfhzYfVCAX6dPTe+zR/GBmWMo6dihXjEBygqoSyHdmSDCWrSjqn5JCFmA+rQ63SuSVkD0IDhPeYsZPaTXRgBEQ7liaqFR9j9let/JkPNbZVbXlUI4vKqahkjJ7KTrxS68WrVTdRK/pFJGPKEGMCdblevshePypRTg40wJecp/CI6BazC3pWudtAE0xSDPZBP4oTxOLHph1I4XVb6qmuHqXoVFPYkzhjeW3k91wACop6JRAV8QCzTXh8Q9+eNPShIC0oarWlVCIBuZfAT0WHR5QclB8000mY2rcGMJ2HAykaRrnYUQ8UDGt/FNtatENpK74rW3M9zXO1laO5uuYahUTXVq42X/I/Lplqc8/kJc/WZlOuPbO1uS66LTVvxQtzT+P+k6bBUqV1aqIuBt0iHyJhA/UoibcZlAMAGqYgeMSUxRBqPNWQxmEoCYZhfcgX43EMq72Gwe25Zi/PUO2o+hqlccJ3b0HSOACTNigDgOh3m9JIPiM+ah2BU81Whas6IS6Ejjas1fAjfaybUxVeXgb1Cpunzg4kinIgXBOd18FjLxzD+LETjT4KvmxFQBwFJCFUgpJu/V9M29ZMMEOvF34VW6GfqbqyvfgoJQH0SG0qV4VZUQoRdq7mfofZnKJYbjLJyHm7HC6FlnyPeCQrR63oMxu7e9bNH7Vy6Jt1Lr1ahKXrluVbncMAtGOGxyFiSAXUikVyaDUdH0i2+LSyQZfrvoYlB5pcmlu/D/0AStJgKLBdnImWNfwZ5nQMiB4bojqonSEFptBRkKA8H2UovegxndDtGMH27vBYufpGfN7Baj7CCpZitC6T+yR9UH9r5KSn/CH5HwFH2FsCJiEQ2XckBzXPsCzdARklKPwnRUDR9SHHm80tGBOhJMclc+X/OaawZx/jFH8lGbf408fF0GuEOb+JNZGsDmvHHkD/RGh40Q5+rbCdH4qGAUnHErDB/ZgDYtwkHnQSvGoy5Fx6lkhUiTbPH552QOuNjOTLJ8ph1EgvaKAyAruWbCQ4qobuOP5beW/vge6e5ZNFvvhUXYsmhc6ufiUqhF3nfeMAf+lpbfae1v65o1U2GaGgCYV2qlTDwTOST6cn+Tyl3HptNdNcm2eRqynPNiGXhCXJ82VlyaRURo2+zLIU+70ggR1lwyWa/PKWq0STc4pR8gUvJIGWmYhO8yhOkjPRFfA2beLNmLbxVmKwjjdrKLhZHXC7DmENYxCKTibPpGjpx6v7rP9+1x+dYbnsPJm2DZnMVt/uTLpXr4+4kD/td5z8QiwfCHROqZFikSeMRJTVmvg4IxTeH8Tpzv0mnzig9F33gb4Eyu90UL/+d0U5OcQS0qyNSLMWJIvirYheLr8cex6/G88hgBnibrzk92QezxbazBEXaBDOXhTBus/RnyWwnbPU6Ahs9lsGNsNo+f4NHwGrh7/PtZbuR8ABH/Omz3zMm73yMe9VOzVthVN52XvdQXTu1TrsRY7sIr3wfk0eiX8t7oge9lT0uAJbDPOMLrM2XcrcoJF3DnaoGe2D/+fji/tMvhh69/a+DWHcFmHuTpsPt4PyxfCRgc2X8cVZeevr8MWa/HB8mfVGrfUd2u/5JXnA7Qht7IaTLre7pm85zjBhyvnv3V7kFW3wv4nbEXajoMvtTuBiPxoG7YO6XbzgFT/Xyp8cqh+9rdW/</diagram></mxfile>
\ No newline at end of file
<mxfile host="Electron" modified="2023-09-12T09:35:59.090Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.2.8 Chrome/102.0.5005.167 Electron/19.0.15 Safari/537.36" etag="wSUAvGrLnrZngoXHDcb2" version="20.2.8" type="device"><diagram id="OfueGv3TDxaJoiHR6Bu8" name="第 1 页">5Vnbcts2EP0azrQP0vAiUtQjdWudsWeSUdI2femAJCjRIQkZhGwpX9/FhTeRVOxYdNNJxhMCiwWwWJyzWECatUiPv1G0392RECeaqYdHzVpqpmmY1gQ+XHKSkqk7k4ItjUMp0ivBJv6KVc9CeohDnCuZFDFCEhbvm8KAZBkOWEOGKCVPTbWIJGFDsEdb3BJsApS0pX/GIdtJ6UzXK/nvON7uipmdoiVFhbIS5DsUkqeayFpp1oISwmQpPS5wwp3X9Mu6p7U0jOKMPafDrfv3HzfhzYfVCAX6dPTe+zR/GBmWMo6dihXjEBygqoSyHdmSDCWrSjqn5JCFmA+rQ63SuSVkD0IDhPeYsZPaTXRgBEQ7liaqFR9j9let/JkPNbZVbXlUI4vKqahkjJ7KTrxS68WrVTdRK/pFJGPKEGMCdblevshePypRTg40wJecp/CI6BazC3pWudtAE0xSDPZBP4oTxOLHph1I4XVb6qmuHqXoVFPYkzhjeW3k91wACop6JRAV8QCzTXh8Q9+eNPShIC0oarWlVCIBuZfAT0WHR5QclB8000mY2rcGMJ2HAykaRrnYUQ8UDGt/FNtatENpK74rW3M9zXO1laO5uuYahUTXVq42X/I/Lplqc8/kJc/WZlOuPbO1uS66LTVvxQtzT+P+k6bBUqV1aqIuBt0iHyJhA/UoibcZlAMAGqYgeMSUxRBqPNWQxmEoCYZhfcgX43EMq72Gwe25Zi/PUO2o+hqlccJ3b0HSOACTNigDgOh3m9JIPiM+ah2BU81Whas6IS6Ejjas1fAjfaybUxVeXgb1Cpunzg4kinIgXBOd18FjLxzD+LETjT4KvmxFQBwFJCFUgpJu/V9M29ZMMEOvF34VW6GfqbqyvfgoJQH0SG0qV4VZUQoRdq7mfofZnKJYbjLJyHm7HC6FlnyPeCQrR63oMxu7e9bNH7Vy6Jt1Lr1ahKXrluVbncMAtGOGxyFiSAXUikVyaDUdH0i2+LSyQZfrvoYlB5pcmlu/D/0AStJgKLBdnImWNfwZ5nQMiB4bojqonSEFptBRkKA8H2UovegxndDtGMH27vBYufpGfN7Baj7CCpZitC6T+yR9UH9r5KSn/CH5HwFH2FsCJiEQ2XckBzXPsCzdARklKPwnRUDR9SHHm80tGBOhJMclc+X/OaawZx/jFH8lGbf408fF0GuEOb+JNZGsDmvHHkD/RGh40Q5+rbCdH4qGAUnHErDB/ZgDYtwkHnQSvGoy5Fx6lkhUiTbPH552QOuNjOTLJ8ph1EgvaKAyAruWbCQ4qobuOP5beW/vge6e5ZNFvvhUXYsmhc6ufiUqhF3nfeMAf+lpbfae1v65o1U2GaGgCYV2qlTDwTOST6cn+Tyl3HptNdNcm2eRqynPNiGXhCXJ82VlyaRURo2+zLIU+70ggR1lwyWa/PKWq0STc4pR8gUvJIGWmYhO8yhOkjPRFfA2beLNmLbxVmKwjjdrKLhZHXC7DmENYxCKTibPpGjpx6v7rP9+1x+dYbnsPJm2DZnMVt/uTLpXr4+4kD/td5z8QiwfCHROqZFikSeMRJTVmvg4IxTeH8Tpzv0mnzig9F33gb4Eyu90UL/+d0U5OcQS0qyNSLMWJIvirYheLr8cex6/G88hgBnibrzk92QezxbazBEXaBDOXhTBus/RnyWwnbPU6Ahs9lsGNsNo+f4NHwGrh7/PtZbuR8ABH/Omz3zMm73yMe9VOzVthVN52XvdQXTu1TrsRY7sIr3wfk0eiX8t7oge9lT0uAJbDPOMLrM2XcrcoJF3DnaoGe2D/+fji/tMvhh69/a+DWHcFmHuTpsPt4PyxfCRgc2X8cVZeevr8MWa/HB8mfVGrfUd2u/5JXnA7Qht7IaTLre7pm85zjBhyvnv3V7kFW3wv4nbEXajoMvtTuBiPxoG7YO6XbzgFT/Xyp8cqh+9rdW/</diagram></mxfile>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.bugstack</groupId>
<artifactId>xfg-dev-tech-ignite</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>xfg-dev-tech-app</module>
<module>xfg-dev-tech-infrastructure</module>
<module>xfg-dev-tech-trigger</module>
</modules>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- # 多数据源路由配置
# mysql 5.x driver-class-name: com.mysql.jdbc.Driver mysql-connector-java 5.1.34
# mysql 8.x driver-class-name: com.mysql.cj.jdbc.Driver mysql-connector-java 8.0.22-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.28</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.ignite/ignite-core -->
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>2.15.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.ignite/ignite-spring -->
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
<version>2.15.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.2-jre</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>xfg-dev-tech</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 统一设定POM版本信息插件 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.7</version>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profileActive>dev</profileActive>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.bugstack</groupId>
<artifactId>xfg-dev-tech-ignite</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>xfg-dev-tech-app</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- # 多数据源路由配置
# mysql 5.x driver-class-name: com.mysql.jdbc.Driver mysql-connector-java 5.1.34
# mysql 8.x driver-class-name: com.mysql.cj.jdbc.Driver mysql-connector-java 8.0.22-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<!-- 工程 module -->
<dependency>
<groupId>cn.bugstack</groupId>
<artifactId>xfg-dev-tech-infrastructure</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.bugstack</groupId>
<artifactId>xfg-dev-tech-trigger</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>xfg-dev-tech-app</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/**</include>
</includes>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<skipTests>true</skipTests>
<testFailureIgnore>false</testFailureIgnore>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>cn.bugstack.xfg.dev.tech.Application</mainClass>
<layout>JAR</layout>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package cn.bugstack.xfg.dev.tech;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@SpringBootApplication
@Configurable
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
package cn.bugstack.xfg.dev.tech.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ignite.configuration.ConnectorConfiguration;
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.configuration.DataStorageConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Configuration
@MapperScan(basePackages = "cn.bugstack.xfg.dev.tech.infrastructure.ignite.dao", sqlSessionFactoryRef = "igniteSqlSessionFactory")
static class IgniteMyBatisConfig {
@Bean("igniteDataSource")
@ConfigurationProperties(prefix = "spring.ignite.datasource")
public DataSource igniteDataSource(Environment environment) {
IgniteConfiguration igniteConfig = new IgniteConfiguration();
DataStorageConfiguration dataStorageConfig = new DataStorageConfiguration();
DataRegionConfiguration defaultDataRegionConfig = new DataRegionConfiguration();
defaultDataRegionConfig.setPersistenceEnabled(false);
dataStorageConfig.setDefaultDataRegionConfiguration(defaultDataRegionConfig);
igniteConfig.setDataStorageConfiguration(dataStorageConfig);
ConnectorConfiguration configuration = new ConnectorConfiguration();
configuration.setIdleTimeout(6000);
configuration.setThreadPoolSize(100);
configuration.setIdleTimeout(60000);
igniteConfig.setConnectorConfiguration(configuration);
return DataSourceBuilder.create()
.url(environment.getProperty("spring.ignite.datasource.url"))
.driverClassName(environment.getProperty("spring.ignite.datasource.driver-class-name"))
.build();
}
@Bean("igniteSqlSessionFactory")
public SqlSessionFactory igniteSqlSessionFactory(DataSource igniteDataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(igniteDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mybatis/mapper/ignite/*.xml"));
return factoryBean.getObject();
}
}
@Configuration
@MapperScan(basePackages = "cn.bugstack.xfg.dev.tech.infrastructure.mysql.dao", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
static class MysqlMyBatisConfig {
@Bean("mysqlDataSource")
@ConfigurationProperties(prefix = "spring.mysql.datasource")
public DataSource mysqlDataSource(Environment environment) {
return DataSourceBuilder.create()
.url(environment.getProperty("spring.mysql.datasource.url"))
.driverClassName(environment.getProperty("spring.mysql.datasource.driver-class-name"))
.build();
}
@Bean("mysqlSqlSessionFactory")
public SqlSessionFactory mysqlSqlSessionFactory(DataSource mysqlDataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(mysqlDataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mybatis/mapper/mysql/*.xml"));
return factoryBean.getObject();
}
}
}
server:
port: 8091
ignite:
dataStorageConfiguration:
defaultDataRegionConfiguration:
persistenceEnabled: false
spring:
ignite:
dataStorageConfiguration:
defaultDataRegionConfiguration:
persistenceEnabled: false
client-mode: true
configuration:
igniteInstanceName: igniteInstance
discoverySpi:
ipFinder:
addresses:
# https://ignite-service.cn/doc/2.7.0/sql/JDBC.html#_1-1-jdbc-thin%E6%A8%A1%E5%BC%8F%E9%A9%B1%E5%8A%A8
# 配置,支持账密、池化、多端点、集群、重连、ssl以及各类策略配置
ignite.datasource:
url: jdbc:ignite:thin://127.0.0.1/
driver-class-name: org.apache.ignite.IgniteJdbcThinDriver
type: com.zaxxer.hikari.HikariDataSource
initialSize: 20
minIdle: 20
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat
mysql.datasource:
url: jdbc:mysql://localhost:13306/road_map?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
initial-size: 20
min-idle: 20
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
filters: stat,wall,log4j2
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
logging:
level:
root: info
config: classpath:logback-spring.xml
\ No newline at end of file
server:
port: 8091
ignite:
dataStorageConfiguration:
defaultDataRegionConfiguration:
persistenceEnabled: false
spring:
ignite:
dataStorageConfiguration:
defaultDataRegionConfiguration:
persistenceEnabled: false
client-mode: true
configuration:
igniteInstanceName: igniteInstance
discoverySpi:
ipFinder:
addresses:
# https://ignite-service.cn/doc/2.7.0/sql/JDBC.html#_1-1-jdbc-thin%E6%A8%A1%E5%BC%8F%E9%A9%B1%E5%8A%A8
# 配置,支持账密、池化、多端点、集群、重连、ssl以及各类策略配置
ignite.datasource:
url: jdbc:ignite:thin://127.0.0.1/;threadPoolSize=50;idleTimeout=60000;
driver-class-name: org.apache.ignite.IgniteJdbcThinDriver
type: com.zaxxer.hikari.HikariDataSource
initialSize: 50
minIdle: 50
maxActive: 50
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat
mysql.datasource:
url: jdbc:mysql://localhost:13306/road_map?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
initial-size: 20
min-idle: 20
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
filters: stat,wall,log4j2
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
logging:
level:
root: info
config: classpath:logback-spring.xml
\ No newline at end of file
server:
port: 8091
ignite:
dataStorageConfiguration:
defaultDataRegionConfiguration:
persistenceEnabled: false
spring:
ignite:
dataStorageConfiguration:
defaultDataRegionConfiguration:
persistenceEnabled: false
client-mode: true
configuration:
igniteInstanceName: igniteInstance
discoverySpi:
ipFinder:
addresses:
# https://ignite-service.cn/doc/2.7.0/sql/JDBC.html#_1-1-jdbc-thin%E6%A8%A1%E5%BC%8F%E9%A9%B1%E5%8A%A8
# 配置,支持账密、池化、多端点、集群、重连、ssl以及各类策略配置
datasource:
url: jdbc:ignite:thin://127.0.0.1/;threadPoolSize=100;idleTimeout=10000;
driver-class-name: org.apache.ignite.IgniteJdbcThinDriver
type: com.zaxxer.hikari.HikariDataSource
initialSize: 20
minIdle: 20
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat
mybatis:
mapper-locations: classpath:/mybatis/mapper/ignite/*.xml
config-location: classpath:/mybatis/config/mybatis-config.xml
logging:
level:
root: info
config: classpath:logback-spring.xml
\ No newline at end of file
spring:
config:
name: xfg-dev-tech
profiles:
active: dev
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<springProperty scope="context" name="log.path" source="logging.path"/>
<!-- 日志格式 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 输出到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0}%X{ServiceId} -%X{trace-id} %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>./data/log/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0}%X{ServiceId} -%X{trace-id} %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>./data/log/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>./data/log/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0}%X{ServiceId} -%X{trace-id} %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./data/log/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 日志文件保留天数【根据服务器预留,可自行调整】 -->
<maxHistory>7</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<!-- WARN 级别及以上 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC_FILE_INFO" class="ch.qos.logback.classic.AsyncAppender">
<!-- 队列剩余容量小于discardingThreshold,则会丢弃TRACT、DEBUG、INFO级别的日志;默认值-1,为queueSize的20%;0不丢失日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>8192</queueSize>
<!-- neverBlock:true 会丢失日志,但业务性能不受影响 -->
<neverBlock>true</neverBlock>
<!--是否提取调用者数据-->
<includeCallerData>false</includeCallerData>
<appender-ref ref="INFO_FILE"/>
</appender>
<appender name="ASYNC_FILE_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 队列剩余容量小于discardingThreshold,则会丢弃TRACT、DEBUG、INFO级别的日志;默认值-1,为queueSize的20%;0不丢失日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>1024</queueSize>
<!-- neverBlock:true 会丢失日志,但业务性能不受影响 -->
<neverBlock>true</neverBlock>
<!--是否提取调用者数据-->
<includeCallerData>false</includeCallerData>
<appender-ref ref="ERROR_FILE"/>
</appender>
<!-- 开发环境:控制台打印 -->
<springProfile name="dev">
<logger name="com.nmys.view" level="debug"/>
</springProfile>
<root level="info">
<appender-ref ref="CONSOLE"/>
<!-- 异步日志-INFO -->
<appender-ref ref="ASYNC_FILE_INFO"/>
<!-- 异步日志-ERROR -->
<appender-ref ref="ASYNC_FILE_ERROR"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 暂时未使用 文档:https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases -->
<typeAliases>
</typeAliases>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bugstack.xfg.dev.tech.infrastructure.ignite.dao.IIgniteUserOrderDao">
<resultMap id="dataMap" type="cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO">
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<result column="user_id" property="userId"/>
<result column="user_mobile" property="userMobile"/>
<result column="sku" property="sku"/>
<result column="sku_name" property="skuName"/>
<result column="order_id" property="orderId"/>
<result column="quantity" property="quantity"/>
<result column="unit_price" property="unitPrice"/>
<result column="discount_amount" property="discountAmount"/>
<result column="tax" property="tax"/>
<result column="total_amount" property="totalAmount"/>
<result column="order_date" property="orderDate"/>
<result column="order_status" property="orderStatus"/>
<result column="is_delete" property="isDelete"/>
<result column="uuid" property="uuid"/>
<result column="ipv4" property="ipv4"/>
<result column="ipv6" property="ipv6"/>
<result column="ext_data" property="extData"/>
<result column="update_time" property="updateTime"/>
<result column="create_time" property="createTime"/>
</resultMap>
<select id="insert" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO">
INSERT INTO user_order (id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time)
VALUES (#{id}, #{userName}, #{userId}, #{userMobile}, #{sku}, #{skuName},
#{orderId}, #{quantity}, #{unitPrice}, #{discountAmount}, #{tax},
#{totalAmount}, #{orderDate}, #{orderStatus}, #{isDelete}, #{uuid},
#{ipv4}, #{ipv6}, #{extData}, #{updateTime}, #{createTime})
</select>
<update id="updateOrderStatusByUserMobile" parameterType="java.lang.String">
UPDATE user_order SET order_status = 2 WHERE user_mobile = #{userMobile}
</update>
<update id="updateOrderStatusByUserId" parameterType="java.lang.String">
UPDATE user_order SET order_status = 1 WHERE user_id = #{userId}
</update>
<update id="updateOrderStatusByOrderId" parameterType="java.lang.String">
UPDATE user_order SET order_status = 1 WHERE order_id = #{orderId}
</update>
<select id="queryMaxId" resultType="java.lang.Long">
SELECT max(id) FROM user_order
</select>
<select id="selectById" parameterType="java.lang.Long" resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE id = #{id}
</select>
<select id="selectByUserId" parameterType="java.lang.String" resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE user_id = #{userId}
</select>
<select id="selectByUserMobile" parameterType="java.lang.String" resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE user_mobile = #{userMobile}
</select>
<select id="selectByOrderId" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO"
resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE order_id = #{orderId}
</select>
<select id="selectByOrderIdAndUserId" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO"
resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE order_id = #{orderId} and user_id = #{userId}
</select>
<select id="selectByUserIdAndOrderId" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO"
resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE user_id = #{userId} and order_id = #{orderId}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bugstack.xfg.dev.tech.infrastructure.mysql.dao.IMySQLUserOrderDao">
<resultMap id="dataMap" type="cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO">
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<result column="user_id" property="userId"/>
<result column="user_mobile" property="userMobile"/>
<result column="sku" property="sku"/>
<result column="sku_name" property="skuName"/>
<result column="order_id" property="orderId"/>
<result column="quantity" property="quantity"/>
<result column="unit_price" property="unitPrice"/>
<result column="discount_amount" property="discountAmount"/>
<result column="tax" property="tax"/>
<result column="total_amount" property="totalAmount"/>
<result column="order_date" property="orderDate"/>
<result column="order_status" property="orderStatus"/>
<result column="is_delete" property="isDelete"/>
<result column="uuid" property="uuid"/>
<result column="ipv4" property="ipv4"/>
<result column="ipv6" property="ipv6"/>
<result column="ext_data" property="extData"/>
<result column="update_time" property="updateTime"/>
</resultMap>
<select id="insert" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO">
INSERT INTO user_order (user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time)
VALUES (#{userName}, #{userId}, #{userMobile}, #{sku}, #{skuName},
#{orderId}, #{quantity}, #{unitPrice}, #{discountAmount}, #{tax},
#{totalAmount}, #{orderDate}, #{orderStatus}, #{isDelete}, #{uuid},
INET_ATON(#{ipv4}), INET6_ATON(#{ipv6}), #{extData}, now(), now())
</select>
<update id="updateOrderStatusByUserMobile" parameterType="java.lang.String">
UPDATE user_order SET order_status = 2 WHERE user_mobile = #{userMobile}
</update>
<update id="updateOrderStatusByUserId" parameterType="java.lang.String">
UPDATE user_order SET order_status = 1 WHERE user_id = #{userId}
</update>
<update id="updateOrderStatusByOrderId" parameterType="java.lang.String">
UPDATE user_order SET order_status = 1 WHERE order_id = #{orderId}
</update>
<select id="queryMaxId" resultType="java.lang.Long">
SELECT max(id) FROM user_order
</select>
<select id="selectById" parameterType="java.lang.Long" resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE id = #{id}
</select>
<select id="selectByUserId" parameterType="java.lang.String" resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE user_id = #{userId}
</select>
<select id="selectByUserMobile" parameterType="java.lang.String" resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE user_mobile = #{userMobile}
</select>
<select id="selectByOrderId" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO"
resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE order_id = #{orderId}
</select>
<select id="selectByOrderIdAndUserId" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO"
resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE order_id = #{orderId} and user_id = #{userId}
</select>
<select id="selectByUserIdAndOrderId" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO"
resultMap="dataMap">
SELECT id, user_name, user_id, user_mobile, sku, sku_name,
order_id, quantity, unit_price, discount_amount, tax,
total_amount, order_date, order_status, is_delete, uuid,
ipv4, ipv6, ext_data, update_time, create_time
FROM user_order
WHERE user_id = #{userId} and order_id = #{orderId}
</select>
</mapper>
package cn.bugstack.xfg.dev.tech.test;
public class ApiTest {
public static void main(String[] args) {
}
}
package cn.bugstack.xfg.dev.tech.test;
import cn.bugstack.xfg.dev.tech.infrastructure.ignite.dao.IIgniteUserOrderDao;
import cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteAtomicSequence;
import org.apache.ignite.Ignition;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class IgniteTest {
@Resource
private IIgniteUserOrderDao igniteUserOrderDao;
@Test
public void test_selectByUserId() {
List<UserOrderPO> list = igniteUserOrderDao.selectByUserId("U001");
log.info("测试结果:{}", JSON.toJSONString(list));
}
@Test
public void test_insert() {
Long aLong = igniteUserOrderDao.queryMaxId();
// Ignite ignite = Ignition.start();
// IgniteAtomicSequence userOrderSequence = ignite.atomicSequence("user_order_sequence", aLong, true);
for (int i = 0; i < 1; i++) {
UserOrderPO userOrderPO = UserOrderPO.builder()
.id(1L)
.userName("小傅哥")
.userId("xfg".concat(RandomStringUtils.randomNumeric(3)))
.userMobile("+86 13521408***")
.sku("13811216")
.skuName("《手写MyBatis:渐进式源码实践》")
.orderId(RandomStringUtils.randomNumeric(11))
.quantity(1)
.unitPrice(BigDecimal.valueOf(128))
.discountAmount(BigDecimal.valueOf(50))
.tax(BigDecimal.ZERO)
.totalAmount(BigDecimal.valueOf(78))
.orderDate(new Date())
.orderStatus(0)
.isDelete(0)
.uuid(UUID.randomUUID().toString().replace("-", ""))
.ipv4("127.0.0.1")
.ipv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
.extData("{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}")
.createTime(new Date())
.updateTime(new Date())
.build();
igniteUserOrderDao.insert(userOrderPO);
}
}
}
package cn.bugstack.xfg.dev.tech.test;
import cn.bugstack.xfg.dev.tech.infrastructure.mysql.dao.IMySQLUserOrderDao;
import cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteAtomicSequence;
import org.apache.ignite.Ignition;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class MySQLTest {
@Resource
private IMySQLUserOrderDao mySQLUserOrderDao;
@Test
public void test_selectByUserId() {
List<UserOrderPO> list = mySQLUserOrderDao.selectByUserId("U001");
log.info("测试结果:{}", JSON.toJSONString(list));
}
@Test
public void test_insert() {
Long aLong = mySQLUserOrderDao.queryMaxId();
Ignite ignite = Ignition.start();
IgniteAtomicSequence userOrderSequence = ignite.atomicSequence("user_order_sequence", aLong, true);
for (int i = 0; i < 1; i++) {
UserOrderPO userOrderPO = UserOrderPO.builder()
.id(userOrderSequence.incrementAndGet())
.userName("小傅哥")
.userId("xfg".concat(RandomStringUtils.randomNumeric(3)))
.userMobile("+86 13521408***")
.sku("13811216")
.skuName("《手写MyBatis:渐进式源码实践》")
.orderId(RandomStringUtils.randomNumeric(11))
.quantity(1)
.unitPrice(BigDecimal.valueOf(128))
.discountAmount(BigDecimal.valueOf(50))
.tax(BigDecimal.ZERO)
.totalAmount(BigDecimal.valueOf(78))
.orderDate(new Date())
.orderStatus(0)
.isDelete(0)
.uuid(UUID.randomUUID().toString().replace("-", ""))
.ipv4("127.0.0.1")
.ipv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334".getBytes())
.extData("{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}")
.createTime(new Date())
.updateTime(new Date())
.build();
mySQLUserOrderDao.insert(userOrderPO);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.bugstack</groupId>
<artifactId>xfg-dev-tech-ignite</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>xfg-dev-tech-infrastructure</artifactId>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
</dependency>
</dependencies>
<build>
<finalName>xfg-dev-tech-infrastructure</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerVersion>${java.version}</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package cn.bugstack.xfg.dev.tech.infrastructure.ignite.dao;
import cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
public interface IIgniteUserOrderDao {
void insert(UserOrderPO userOrderPO);
void updateOrderStatusByUserId(String userId);
void updateOrderStatusByUserMobile(String userMobile);
void updateOrderStatusByOrderId(String orderId);
UserOrderPO selectById(Long id);
List<UserOrderPO> selectByUserId(String userId);
List<UserOrderPO> selectByUserMobile(String userMobile);
UserOrderPO selectByOrderId(String orderId);
UserOrderPO selectByOrderIdAndUserId(UserOrderPO userOrderPO);
UserOrderPO selectByUserIdAndOrderId(UserOrderPO userOrderPO);
Long queryMaxId();
}
package cn.bugstack.xfg.dev.tech.infrastructure.ignite.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserOrderPO {
/** 自增ID */
private Long id;
/** 用户姓名 */
private String userName;
/** 用户编号 */
private String userId;
/** 用户电话 */
private String userMobile;
/** 商品编号 */
private String sku;
/** 商品名称 */
private String skuName;
/** 订单ID */
private String orderId;
/** 商品数量 */
private int quantity;
/** 商品价格 */
private BigDecimal unitPrice;
/** 折扣金额 */
private BigDecimal discountAmount;
/** 费率金额 */
private BigDecimal tax;
/** 支付金额 */
private BigDecimal totalAmount;
/** 订单日期 */
private Date orderDate;
/** 订单状态 */
private int orderStatus;
/** 逻辑删单 */
private int isDelete;
/** 唯一索引 */
private String uuid;
/** 设备地址 */
private String ipv4;
/** 设备地址 */
private String ipv6;
/** 扩展数据 */
private String extData;
/** 更新时间 */
private Date updateTime;
/** 创建时间 */
private Date createTime;
}
package cn.bugstack.xfg.dev.tech.infrastructure.mysql.dao;
import cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO;
import java.util.List;
public interface IMySQLUserOrderDao {
void insert(UserOrderPO userOrderPO);
void updateOrderStatusByUserId(String userId);
void updateOrderStatusByUserMobile(String userMobile);
void updateOrderStatusByOrderId(String orderId);
UserOrderPO selectById(Long id);
List<UserOrderPO> selectByUserId(String userId);
List<UserOrderPO> selectByUserMobile(String userMobile);
UserOrderPO selectByOrderId(String orderId);
UserOrderPO selectByOrderIdAndUserId(UserOrderPO userOrderPO);
UserOrderPO selectByUserIdAndOrderId(UserOrderPO userOrderPO);
Long queryMaxId();
}
package cn.bugstack.xfg.dev.tech.infrastructure.mysql.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserOrderPO {
/** 自增ID */
private Long id;
/** 用户姓名 */
private String userName;
/** 用户编号 */
private String userId;
/** 用户电话 */
private String userMobile;
/** 商品编号 */
private String sku;
/** 商品名称 */
private String skuName;
/** 订单ID */
private String orderId;
/** 商品数量 */
private int quantity;
/** 商品价格 */
private BigDecimal unitPrice;
/** 折扣金额 */
private BigDecimal discountAmount;
/** 费率金额 */
private BigDecimal tax;
/** 支付金额 */
private BigDecimal totalAmount;
/** 订单日期 */
private Date orderDate;
/** 订单状态 */
private int orderStatus;
/** 逻辑删单 */
private int isDelete;
/** 唯一索引 */
private String uuid;
/** 设备地址 */
private String ipv4;
/** 设备地址 */
private byte[] ipv6;
/** 扩展数据 */
private String extData;
/** 更新时间 */
private Date updateTime;
/** 创建时间 */
private Date createTime;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.bugstack</groupId>
<artifactId>xfg-dev-tech-ignite</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>xfg-dev-tech-trigger</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>cn.bugstack</groupId>
<artifactId>xfg-dev-tech-infrastructure</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>xfg-dev-tech-trigger</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerVersion>${java.version}</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package cn.bugstack.xfg.dev.tech.trigger.http;
import cn.bugstack.xfg.dev.tech.infrastructure.ignite.dao.IIgniteUserOrderDao;
import cn.bugstack.xfg.dev.tech.infrastructure.ignite.po.UserOrderPO;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteAtomicSequence;
import org.apache.ignite.Ignition;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
/**
* ab -c 1 -n 1 http://127.0.0.1:8091/api/ignite/start
* ab -c 20 -n 1000 http://127.0.0.1:8091/api/ignite/insert
*
* ab -c 20 -n 1000 http://127.0.0.1:8091/api/ignite/cacheData
* ab -c 20 -n 1000 http://127.0.0.1:8091/api/ignite/selectByOrderId
*/
@Slf4j
@RestController("ignite")
@RequestMapping("/api/ignite/")
public class IgniteController {
@Resource
private IIgniteUserOrderDao igniteUserOrderDao;
private IgniteAtomicSequence userOrderSequence = null;
private AtomicLong count = null;
// 缓存数据,从库中拉取。
private List<UserOrderPO> userOrderPOList = Collections.synchronizedList(new ArrayList<>());
/**
* 随机取数据,加入缓存测试
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 2000 http://127.0.0.1:8091/api/ignite/cacheData
*/
@RequestMapping(value = "cacheData", method = RequestMethod.GET)
public String cacheData() {
Long maxId = igniteUserOrderDao.queryMaxId();
long idx = new Random().nextLong() % maxId;
if (idx < 0) {
idx += maxId;
}
UserOrderPO userOrderPO = igniteUserOrderDao.selectById(idx);
userOrderPOList.add(userOrderPO);
log.info("cache 存储数据到缓存,用于查询、更新测试 count:{} ", userOrderPOList.size());
return "done! 缓存数量:" + userOrderPOList.size();
}
/**
* ab -c 1 -n 1 http://127.0.0.1:8091/api/ignite/start
*/
@RequestMapping(value = "start", method = RequestMethod.GET)
public String start() {
Long idx = igniteUserOrderDao.queryMaxId();
if (idx == null) idx = 0L;
count = new AtomicLong(idx);
// Ignite ignite = Ignition.start();
// this.userOrderSequence = ignite.atomicSequence("user_order_sequence", idx, true);
log.info("初始值完成 idx: {}", idx);
return String.valueOf(idx);
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 50 -n 50000 http://127.0.0.1:8091/api/ignite/insert
*/
@RequestMapping("insert")
public String insert() {
log.info("性能测试,insert");
if (null == this.count) throw new RuntimeException("请先执行 api/ignite/start");
UserOrderPO userOrderPO = UserOrderPO.builder()
.id(count.incrementAndGet())
.userName("小傅哥")
.userId("xfg".concat(RandomStringUtils.randomNumeric(3)))
.userMobile("+86 1352140".concat(String.format("%04d", new Random().nextInt(1000))))
.sku("13811216")
.skuName("《手写MyBatis:渐进式源码实践》")
.orderId(RandomStringUtils.randomNumeric(11))
.quantity(1)
.unitPrice(BigDecimal.valueOf(128))
.discountAmount(BigDecimal.valueOf(50))
.tax(BigDecimal.ZERO)
.totalAmount(BigDecimal.valueOf(78))
.orderDate(new Date())
.orderStatus(0)
.isDelete(0)
.uuid(UUID.randomUUID().toString().replace("-", ""))
.ipv4("127.0.0.1")
.ipv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
.extData("{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}")
.updateTime(new Date())
.createTime(new Date())
.build();
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.insert(userOrderPO);
stopwatch.stop();
log.info("性能测试,insert 耗时: {}", stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 1 -n 1 http://127.0.0.1:8091/api/ignite/updateOrderStatusByUserId
*/
@RequestMapping("updateOrderStatusByUserId")
public String updateOrderStatusByUserId() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.updateOrderStatusByUserId(userOrderPO.getUserId());
stopwatch.stop();
log.info("性能测试,updateOrderStatusByUserMobile userId:{} 耗时: {}", userOrderPO.getUserId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 1 -n 1 http://127.0.0.1:8091/api/ignite/updateOrderStatusByUserMobile
*/
@RequestMapping("updateOrderStatusByUserMobile")
public String updateOrderStatusByUserMobile() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.updateOrderStatusByUserMobile(userOrderPO.getUserMobile());
stopwatch.stop();
log.info("性能测试,updateOrderStatusByUserMobile userMobile:{} 耗时: {}", userOrderPO.getUserMobile(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 1 -n 1 http://127.0.0.1:8091/api/ignite/updateOrderStatusByOrderId
*/
@RequestMapping("updateOrderStatusByOrderId")
public String updateOrderStatusByOrderId() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.updateOrderStatusByOrderId(userOrderPO.getOrderId());
stopwatch.stop();
log.info("性能测试,updateOrderStatusByOrderId orderId:{} 耗时: {}", userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 1 -n 1 http://127.0.0.1:8091/api/ignite/selectByUserId
*/
@RequestMapping("selectByUserId")
public String selectByUserId() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.selectByUserId(userOrderPO.getOrderId());
stopwatch.stop();
log.info("性能测试,selectByUserId orderId:{} 耗时: {}", userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 50 http://127.0.0.1:8091/api/ignite/selectByUserMobile
*/
@RequestMapping("selectByUserMobile")
public String selectByUserMobile() {
log.info("性能测试,selectByUserMobile");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.selectByUserMobile(userOrderPO.getUserMobile());
stopwatch.stop();
log.info("性能测试,selectByUserMobile userMobile:{} 耗时: {}", userOrderPO.getUserMobile(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 2000 http://127.0.0.1:8091/api/ignite/selectByOrderId
* 2.300 seconds
*/
@RequestMapping("selectByOrderId")
public String selectByOrderId() {
log.info("性能测试,selectByOrderId");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.selectByOrderId(userOrderPO.getOrderId());
stopwatch.stop();
log.info("性能测试,selectByOrderId orderId:{} 耗时: {}", userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 500 http://127.0.0.1:8091/api/ignite/selectByOrderIdAndUserId
*/
@RequestMapping("selectByOrderIdAndUserId")
public String selectByOrderIdAndUserId() {
log.info("性能测试,selectByOrderIdAndUserId");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.selectByOrderIdAndUserId(userOrderPO);
stopwatch.stop();
log.info("性能测试,selectByOrderIdAndUserId orderId:{} userId:{} 耗时: {}", userOrderPO.getOrderId(), userOrderPO.getUserId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 50 http://127.0.0.1:8091/api/ignite/selectByUserIdAndOrderId
*/
@RequestMapping("selectByUserIdAndOrderId")
public String selectByUserIdAndOrderId() {
log.info("性能测试,selectByUserIdAndOrderId");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
igniteUserOrderDao.selectByUserIdAndOrderId(userOrderPO);
stopwatch.stop();
log.info("性能测试,selectByUserIdAndOrderId userId:{} orderId:{} 耗时: {}", userOrderPO.getUserId(), userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
}
package cn.bugstack.xfg.dev.tech.trigger.http;
import cn.bugstack.xfg.dev.tech.infrastructure.mysql.dao.IMySQLUserOrderDao;
import cn.bugstack.xfg.dev.tech.infrastructure.mysql.po.UserOrderPO;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
/**
* ab -c 20 -n 1000 http://127.0.0.1:8091/api/mysql/cacheData
* ab -c 50 -n 1000 http://127.0.0.1:8091/api/mysql/selectByOrderId
*/
@Slf4j
@RestController("mysql")
@RequestMapping("/api/mysql/")
public class MySQLController {
@Resource
private IMySQLUserOrderDao mySQLUserOrderDao;
// 缓存数据,从库中拉取。
private final List<UserOrderPO> userOrderPOList = Collections.synchronizedList(new ArrayList<>());
/**
* 随机取数据,加入缓存测试
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 2000 http://127.0.0.1:8091/api/mysql/cacheData
*/
@RequestMapping(value = "cacheData", method = RequestMethod.GET)
public String cacheData() {
Long maxId = mySQLUserOrderDao.queryMaxId();
long idx = new Random().nextLong() % maxId;
if (idx < 0) {
idx += maxId;
}
UserOrderPO userOrderPO = mySQLUserOrderDao.selectById(idx);
userOrderPOList.add(userOrderPO);
log.info("cache 存储数据到缓存,用于查询、更新测试 count:{} ", userOrderPOList.size());
return "done! 缓存数量:" + userOrderPOList.size();
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 100 -n 60000 http://127.0.0.1:8091/api/mysql/insert
*/
@RequestMapping("insert")
public String insert() {
log.info("性能测试,insert");
UserOrderPO userOrderPO = UserOrderPO.builder()
.userName("小傅哥")
.userId("xfg" .concat(RandomStringUtils.randomNumeric(3)))
.userMobile("+86 1352140" .concat(String.format("%04d", new Random().nextInt(1000))))
.sku("13811216")
.skuName("《手写MyBatis:渐进式源码实践》")
.orderId(RandomStringUtils.randomNumeric(11))
.quantity(1)
.unitPrice(BigDecimal.valueOf(128))
.discountAmount(BigDecimal.valueOf(50))
.tax(BigDecimal.ZERO)
.totalAmount(BigDecimal.valueOf(78))
.orderDate(new Date())
.orderStatus(0)
.isDelete(0)
.uuid(UUID.randomUUID().toString().replace("-", ""))
.ipv4("127.0.0.1")
.ipv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334" .getBytes())
.extData("{\"device\": {\"machine\": \"IPhone 14 Pro\", \"location\": \"shanghai\"}}")
.build();
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.insert(userOrderPO);
stopwatch.stop();
log.info("性能测试,insert 耗时: {}", stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 1 -n 1 http://127.0.0.1:8091/api/mysql/updateOrderStatusByUserId
*/
@RequestMapping("updateOrderStatusByUserId")
public String updateOrderStatusByUserId() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.updateOrderStatusByUserId(userOrderPO.getUserId());
stopwatch.stop();
log.info("性能测试,updateOrderStatusByUserMobile userId:{} 耗时: {}", userOrderPO.getUserId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 1 -n 1 http://127.0.0.1:8091/api/mysql/updateOrderStatusByUserMobile
*/
@RequestMapping("updateOrderStatusByUserMobile")
public String updateOrderStatusByUserMobile() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.updateOrderStatusByUserMobile(userOrderPO.getUserMobile());
stopwatch.stop();
log.info("性能测试,updateOrderStatusByUserMobile userMobile:{} 耗时: {}", userOrderPO.getUserMobile(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 2000 http://127.0.0.1:8091/api/mysql/updateOrderStatusByOrderId
*/
@RequestMapping("updateOrderStatusByOrderId")
public String updateOrderStatusByOrderId() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.updateOrderStatusByOrderId(userOrderPO.getOrderId());
stopwatch.stop();
log.info("性能测试,updateOrderStatusByOrderId orderId:{} 耗时: {}", userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 1 -n 1 http://127.0.0.1:8091/api/mysql/selectByUserId
*/
@RequestMapping("selectByUserId")
public String selectByUserId() {
log.info("性能测试,update");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.selectByUserId(userOrderPO.getOrderId());
stopwatch.stop();
log.info("性能测试,selectByUserId orderId:{} 耗时: {}", userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 50 http://127.0.0.1:8091/api/mysql/selectByUserMobile
*/
@RequestMapping("selectByUserMobile")
public String selectByUserMobile() {
log.info("性能测试,selectByUserMobile");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.selectByUserMobile(userOrderPO.getUserMobile());
stopwatch.stop();
log.info("性能测试,selectByUserMobile userMobile:{} 耗时: {}", userOrderPO.getUserMobile(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 2000 http://127.0.0.1:8091/api/mysql/selectByOrderId
* 2.143 seconds
*/
@RequestMapping("selectByOrderId")
public String selectByOrderId() {
log.info("性能测试,selectByOrderId");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.selectByOrderId(userOrderPO.getOrderId());
stopwatch.stop();
log.info("性能测试,selectByOrderId orderId:{} 耗时: {}", userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 500 http://127.0.0.1:8091/api/mysql/selectByOrderIdAndUserId
*/
@RequestMapping("selectByOrderIdAndUserId")
public String selectByOrderIdAndUserId() {
log.info("性能测试,selectByOrderIdAndUserId");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.selectByOrderIdAndUserId(userOrderPO);
stopwatch.stop();
log.info("性能测试,selectByOrderIdAndUserId orderId:{} userId:{} 耗时: {}", userOrderPO.getOrderId(), userOrderPO.getUserId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
/**
* ab:ApacheBench工具的命令。
* -c 20:并发请求数为20,表示同时发送20个请求。
* -n 600:总请求数为60,表示发送60个请求。
* <p>
* ab -c 20 -n 50 http://127.0.0.1:8091/api/mysql/selectByUserIdAndOrderId
*/
@RequestMapping("selectByUserIdAndOrderId")
public String selectByUserIdAndOrderId() {
log.info("性能测试,selectByUserIdAndOrderId");
UserOrderPO userOrderPO = userOrderPOList.remove(0);
Stopwatch stopwatch = Stopwatch.createStarted();
mySQLUserOrderDao.selectByUserIdAndOrderId(userOrderPO);
stopwatch.stop();
log.info("性能测试,selectByUserIdAndOrderId userId:{} orderId:{} 耗时: {}", userOrderPO.getUserId(), userOrderPO.getOrderId(), stopwatch);
return "done! 耗时:" + stopwatch;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册