- 博客(47)
- 收藏
- 关注
原创 Nginx 网关解决 Geoserver 图层访问控制
要对 Geoserver 进行图层访问控制,有很多种办法,最简单的是通过 Geoserver 本身提供的图层访问权限设置,比如RBAC 基于用户角色权限进行控制,基于Geoserver 的 Jetty 容器的 IP 过滤器设置黑名单,比较复杂的是基于Geoserver插件 AuthKey 的访问控制,基于 GeoNode 程序的访问控制,后面两个不好操作。
2024-10-31 18:08:32 183
原创 Python Fiona 生成 Geopackage 文件
我们项目原本使用 Shapefile 格式存储 GIS 信息,Shapefile 优点是比较简单,网上资料多,但 Shapefile 格式比较古老,有时候就不太够用了,限制较多,比如 Shapefile 里一个要素的属性名称长度不能超过10 字符,属性内容不能超过 255 个字符,超过了就要被截断,这个就很麻烦,比如图层中不能直接获取到要素的 path 字段,因为 path 太长会被截断,导致查询这个信息的时候还有走后端接口;当 Shapefile 中的地理要素数量非常庞大时,数据的读取和查询性能会下降;
2024-10-29 18:26:29 382
原创 Debezium Kafka 全量同步,处理大量写入问题
Kafka 一个主题可以有多个分区,每个分区都可以被一个线程所消费,因为要写入消息到MySQL ,批量插入比单次插入效率高很多,如果还是单次插入到MySQL,那么引入这个Kafka就没什么用,还是那么慢,所以我们决定多开几个线程批量拉取Kafka里的数据,并批量插入到MySQL,因为当前我们程序每秒能单次插入1700多条数据到Kafka,所以我们的Kafka 一个主题开4个分区,每个分区都有一个线程批量拉取消息进行消费,到此消息消费速度刚好赶上了消息生成速度了。最终我们决定使用 Kafka。
2024-10-22 17:46:24 540
原创 Debezium 同步 MySQL 实时数据并解决数据重复消费问题
之后我们使用 binlog2sql 这个 python 工具读取了已归档的 binlog 文件,发现里面没有重复的 sql ,这说明 MySQL binlog 还是没有问题的,问题在 Debezium,但 Debezium 作为一个成熟的 cdc 工具应该也不会有什么大的问题,可能是 Debezium 的配置问题,但检查了 Debezium 的所有配置后还是没发现有什么问题,配置改了后重新运行结果还是一样。后面我们使用 gtid 过滤相同属性就解决了数据重复问题。我们的 MySQL 的版本是 5.7。
2024-06-25 16:44:49 719
原创 常用位算法
3,n&(~n+1) 获取 n 最后的 1的数字,假设 n 为 110010,n&(~n+1) 就是 000010。4,n&(n-1), 它会删除 n 中最后一个1。2, 判断奇偶,n&1,即判断最后一位是0还是1,如果结果为0,就是偶数,是1 就是奇数。获取 32 位二进制的 1 的个数,它会循环遍历 n 中为 1 的个数的次数。获取 32 位二进制的 1 的个数,它会循环遍历 n 中为 1 的个数的次数。1,位翻转 n^1 ,n 是0 或 1,和 1 异或后位翻转了。
2024-06-06 11:16:36 284
原创 双指针: 盛水最多的容器
当左指针在 0 处,右指针在 height.length -1 处,此时容器的底最长,但要想盛最多的水,就要让容器的底乘高数值最大,容器的高取左右两指针所指向的元素最小值。给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水。当左指针指向的高比右指针所指向的高小,左指针往右前进 1;当左指针指向的高比右指针所指向的高大,右指针往左前进 1;2.当n小于2时,视为不能形成容器,请返回0。
2024-06-05 17:41:30 343
原创 回溯算法解法 针对数组或字符串
例如:给出的字符串为"25525522135",返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系)2,确定 dfs() 的结束状态,本地中是找到一个合法的ip字符串,如果发现中间状态 tmp 不是一个合法的ip,就终止本次回溯。dfs(s,0,"") s 是不变的,我们要搜索它得到整个解,0是索引初始位置,"" 是初始中间状态。注意:ip地址是由四段数字组成的数字序列,格式如 "x.x.x.x",其中 x 的范围应当是 [0,255]。
2024-06-05 16:23:44 295
原创 GIS Java 生成四至图
对于地图上的一个多边形地块,其四至图就是能够覆盖这个多边形的最小矩形,也就是求出这个多边形的最东点,最西点,最南点,最北点,即四至点,其中最西点和最北点构成左上角,最南点和最东点构成右下点,只要知道了左上角和右下角,就知道这个最小覆盖矩形了。前端生成四至图是比较简单的,后端如何生成四至图呢?后端生成四至图得到的是一个图片,图片的底图是天地图,在这个底图之上就是多边形。
2024-05-31 16:44:36 1158
原创 ThreadLocal
Java 中的 ThreadLocal 是一个线程的局部变量,它消除了多线程的数据读写争用,它一般用于一个线程在多个不同方法里的数据传递,比如会话登录,一请求一线程,Spring 事务等。
2024-01-25 16:05:54 406
原创 Netty Pipeline
Netty 中的业务处理流程都是在 Pipeline 中被处理的,它底层是一个双向链表,链表元素是ChannelInBoundHandler 和 ChannelOutBoundHandler,二者都是 ChannelHandler 接口类,一个 Channel 拥有一个 Pipeline, 当 Channel 被创建时会创建一个空的Pipeline。
2024-01-25 10:13:24 427
原创 Netty Reactor 模式解析
上面短短的服务端代码做了很多工作,当它刚启动还没有客户端请求连接时,bossGroup 连接线程池里的一个线程 EventLoop 会初始化一个 NioServerSocketChannel ,并把这个Channel注册到这个EventLoop 持有的IO多路复用选择器Selector里,Selector 会监听Channel里的 SelectionKey.OP_ACCEPT 事件,一旦有客户端连接过来,它会通过下面代码获取到一个。在写Netty 服务端代码的时候,下面的代码时必不可少的,这是为什么呢?
2024-01-24 15:26:37 693
原创 Netty 中的读和写
ChannelInboundHandler 使用了责任链模式,每个 ChannelInboundHandler 就相当于一个拦截器,对它感兴趣的数据进行处理,比如编解码,解析http,websocket协议等,ChannelOutboundHandler 对数据进行写操作,它底层是一个Entry 链表。1,在简单的手写Netty demo项目中,Netty 读和写数据都是对 Channel 的读和写,也就是对NioSocketChannel 中的 SelectableChannel 的读和写。
2024-01-23 10:34:56 441
原创 python 全量同步和增量同步实践
简单的增量同步可以使用定时断点同步,即使用定时任务获取从库的上次备份的最后一条数据,从最大的id处开始定时同步数据,同时多传递一个 id 参数,我们的id是long类型,是有序递增的,如果id 不是有序递增的,如果 create_time 是有序递增的也可以。我们可以监听主库的binlog,然后把 insert,update,delete 语句解析出来,到从库重新执行一遍。如果我们要做整库数据迁移和同步,我们可以先同步库表结构等元数据,再去同步表数据。它要求数据库开启 binlog,且数据格式为 row。
2024-01-16 16:22:50 1086
原创 写一个水平分表插件
2,SQL 解析,使用 JSqlParser 或 druid 的 SQL 解析器去获取静态 SQL 的路由键和路由键实际参数。因为如果找不到路由键,那就扫全表,如果找不到路由键实际参数,就不知道要路由到哪些子表,也要扫全表。这些只能完成比较简单的单表增删改查,无法应对项目里复杂的 SQL 需求,还需要做其他的工作。1, 解析路由配置,知道哪些表需要路由,哪些表不需要路由,并知道路由参数;3,根据路由键和路由参数计算目标路由表,生成新的 SQL。
2023-09-07 16:06:19 164
原创 Spring Boot 制作 Windows 客户端
2,当客户端更新时就下载一个新的 exe 文件到本地,使用 sc config 修改 exe 文件的地址,然后使用 taskkill 杀死服务,因为该服务有崩溃重启功能,所以过了几秒钟后,服务重启了,服务变为新服务。1,之前我们使用 Spring Boot 去做 Windows 的客户端,使用 exe4j 这个工具把 jar 包打成 exe 文件,选择“服务”模式,最后使用 Windows 的 sc 命令注册该 exe 文件为 windows 服务,并设置为自动模式,失败重启。.bat 批处理脚本。
2023-08-17 19:12:15 364
原创 Netty 思想
但它的所有的 IO 操作都是异步的,全是各种 Future,Promise(Promise也是一种特殊的Future),因为 jdk 1.5 的 Future 没有事件监听功能,所以Netty 自己实现的 Future 具有事件监听回调,这是常规的异步操作,jdk 1.8 有了 CompleteFuture ,就不需要自己手动实现异步监听回调了,非常方便。2,Java 里的异步操作,底层基本上都是通过线程池去实现的,因为新开一个线程去执行任务,其实就是最基本的异步操作。
2023-08-17 18:53:23 62
原创 Mybatis 插件: MySQL sql 语句转换为合法的达梦sql语句
项目已经运行了很多年了,里面有大量的 SQL 语句,底层数据库都是 MySQL,现在要迁移到达梦数据库,怎么办?一开始的解决方案是这样的,先拷贝一份 mapper xml 文件, 再在上面改 SQL ,SQL 功能逻辑不变,可能就是小修小改, SQL 语句无非就是增删改查,而且大多数都是单表的增删改查,只是多费一些时间而已,但怎么知道这个 SQL 语句要不要改?改了后怎么测试它是正确的?很多人都属性 MySQL 但不熟悉达梦,这时候就要开始去看别人踩过的坑,下载一份官方手册,对照着看,估计一下工作量了。
2023-05-12 23:51:20 4975 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人