1. 查询锁表会话和表名
1 | select request_session_id 锁表进程, OBJECT_NAME(resource_associated_entity_id) 被锁表名 |
2. 查询锁表状态及锁表SQL
1 | SELECT A.BLOCKING_SESSION_ID, A.WAIT_DURATION_MS, A.SESSION_ID, B.TEXT |
3. 查询阻塞语句
1 | SELECT BL.SPID BLOCKING_SESSION, |
1 | select request_session_id 锁表进程, OBJECT_NAME(resource_associated_entity_id) 被锁表名 |
1 | SELECT A.BLOCKING_SESSION_ID, A.WAIT_DURATION_MS, A.SESSION_ID, B.TEXT |
1 | SELECT BL.SPID BLOCKING_SESSION, |
SpringCloud项目经过网关后,有时候会出现服务返回了数据, 但是客户端收不到数据, 持续等待的情况. 通过查看请求头, 发现除了大量的forward
头外, 有一个expect
不认识, 通过查阅资料发现作用如下:
在使用curl做POST的时候(比如通过PHP发起post请求),当要POST的数据大于1024字节的时候,curl并不会直接就发起POST请求, 而是会分为2步:
发送一个请求,包含一个Expect:100-continue,询问Server使用愿意接受数据。接收到Server返回的100-continue应答以后, 才把数据POST给Server。
参考官方文档, 有以下解决方案:
在服务配置添加过滤器:
1 | spring: |
添加全局过滤器
1 | spring: |
openLdap是一套开源的AD域管理工具(不过看起来很复古, 不知道有没有更好用的替代方案)
1 | docker run \ |
版本建议用1.4.0, 更高版本经测试在nextcloud中获取分组存在问题
phpLdapAdmin是管理ldap数据的客户端
1 | docker run \ |
使用时将 192.168.11.84
替换为ldap的部署地址
在浏览器打开phpLdapAdmin: http://ip:8080/
用户名格式:
1 | cn=admin,dc=sealin,dc=net |
dc为启动ldap实例时的 –env LDAP_DOMAIN=”sealin.net”值, 以.分隔为多个dc,如:
1 | # 如果域名为: sealin.net.cn, 对应的用户名为 |
Create new entry here
先创建:Samba: Domain
, 产生一个SID
接着创建分组:Samba: Group Mapping
然后创建用户: Samba: Account
为用户添加显示名称字段:
在左侧选中刚刚添加的用户, 在界面上打开此功能: Add new attribute
, 在下拉框中选择displayName
, 填写要用于显示的名称.
首先从设置-应用
界面启用插件, 默认是关闭的:LDAP user and group backend
启用该插件后, 在设置
界面左侧, 会多出一项LDAP-AD整合
填入服务地址(不填写端口), 然后点检测端口
, 没问题的话会检测出我们启动的端口:389
按照上述用户名格式, 填写用户和密码, 接着点保存凭据
依次点下方的检测基础DN
– 测试基础DN
如无意外, 下方的状态标签会变成配置完成
, 并附带绿色圆点
上一步通过后, 点继续
按钮, 在用户
选项卡的只有这些对象类:
选项中, 选择inetOrgPerson
, 选好以后可以点击左下方的验证设置和统计用户
, 如果旁边显示发现 1 个用户
, 说明配置通过, 可以继续
在此处, 可以配置自定义的字段用于nextcloud的登陆用户名, 选择需要的字段, 点继续
此选项卡, 可以限制nextcloud从哪些组获取ldap中的用户信息, 选择好需要的分组后, 点验证设置和统计分组数
, 提示发现 * 个分组
, 说明配置无误.此时, 我们的nextcloud已经集成了ldap的数据, 不过有些小问题需要处理
在nextcloud的用户管理界面, 可以看到ldap的用户名称上显示了一串UUID, 不易于用户理解.
我们可以回到nextcloud中的ldap配置界面, 打开右侧的砖家
功能.
修改用户 UUID 属性:
这一项的值, 改成ldap用户信息中存在的字段, 比如默认带的sn
字段, 填上sn
改完以后, 清除用户-LDAP用户映射
, 再回到nextcloud用户管理界面, 可以发现用户名已显示正常
ldap支持为用户创建自定义属性, 结合nextcloud配置LDAP界面高级
-特殊属性
设置, 基本用户同步过来后可以初始化所有信息, 如配额, 邮箱等.当然也有一些限制, 在nextcloud中创建用户无法选择ldap中的分组, 也就是只能通过LDAP创建用户给cloud用, cloud无法向ldap中添加用户, 如果用户较多的话无法让各组分而治之, 管理ldap的人亚历山大.
装了edge后, mailto链接都会使用edge打开, 并且跳转到gmail, 研究了半天, 找到了关掉这个设置的地方.
在edge打开这个设置界面:
1 | edge://settings/content/handlers |
删除 mailto 链接的gmail, 或者关掉这个设置.
截止发文日期最新版测试通过.
升级bigsur后, PD问题更多了, 不得已还是用VM.
提供几个可以用的号.
1 | ZF3R0-FHED2-M80TY-8QYGC-NPKYF |
用了一年mac自带的输入法, 本以为调教一段时间总会变得好使, 事实证明还是在下输了.
比如打字的时候现在已经落下打全拼的后遗症了, 比如以前习惯的打”是”, 只需要打一个s一般空格就可以了, 默认第一个就是”是”字, 但是mac的输入法偏不, 过了这么久第一个80%的时间会打出”说”; 比如要打”的”, 以前打个d空格就可以了, mac自带的输入法80%几率可能会打出”到”…另外没办法在中文模式下使用英文标点, 很误事.
为什么是80%?当你再次打出s准备选第二个选项的时候, 可能候选顺序已经变了
没辙, 还是放弃直接换某狗吧, 毕竟用了这么多年还是很顺手的.
用某狗有个问题, mac输入法默认了一个ABC输入法, 还不能在设置里面删除, 切换应用很可能自动变回ABC输入法, 又要⌘+空格切换一次, 似乎不太完美.
找到某乎一帖子
https://www.zhihu.com/question/21459701/answer/478489248
大致方案如下:
PlistEdit Pro
~/Library/Preferences/com.apple.HIToolbox.plist
找到enabled input source这个分组, 展开里面的明细(我这里有7个), 明细也能展开, 里面有3个键值对, 删掉name=ABC的配置项
注销重新登录就好了
不好意思, 配错图了
连接VPN或者创建多个网卡后(如安装虚拟机/docker等服务), 本机会存在多个IP地址, 这种情况下, 启动本地服务提供者后, 创建的dubbo服务绑定的网卡可能会无法准确找到物理网卡地址, 导致消费端启动后无法找到服务.
通过查看dubbo的源码, 可以发现获取IP地址的事情是调用jdk提供的类: java.net.InetAddress#getLocalHost
主要逻辑如下:
1 | public static InetAddress getLocalHost() throws UnknownHostException { |
大致流程为: 获取当前主机名 –> 检查主机名是否可以连接 –> 如果主机名为localhost, 直接获取本地回环地址(一般为127.0.0.1) –> 查询nameService获取当前主机名的实际地址
可以发现这个地址在获取的过程中, 是需要去查询域名解析服务的, 域名解析流程首先会从本地hosts文件中获取地址, 也就是说, 我们只需要设置一个跟主机名一样的地址到hosts文件中, 就可以让dubbo获取到自己想要的地址了.
1 | /** |
执行以上代码, 发现程序一直在执行, 没有按预期的流程正常退出.
导致死锁的原因, 只是因为不同线程之间相互持有了所需资源, 并且都在等对方释放,自己才能继续执行后续代码. 如同两个都只拿了一根筷子的人, 都打算让对方先把手上都筷子交给自己, 自己吃完饭再把筷子交出去一样, 双方都在等待, 导致的结果就是死锁.
首先找到当前应用的PID, 使用jdk提供的jps命令.
1 | sealin@Sealin: ~ $ jps |
可以找到我们测试死锁的进程pid为: 87696
使用jstack工具查看当前进程信息
1 | sealin@Sealin: ~ $ jstack 87696 |
很明显的可以看到死锁发生的位置, 进入 TestDeadLock.java:33 和 TestDeadLock.java:20 查看执行的什么操作导致了死锁
第33行是我们thread2对lock1进行加锁的位置
第20行是thread1对lock2进行加锁的位置.与我们上面分析的原因一致, 相互等待对方释放锁资源.
既然知道原因了, 解决起来也就有方向了, 在本示例中, 只要让线程1和线程2不要同时执行就可以解决问题, 当然实际应用中死锁问题解决起来会复杂很多.
1 | thread1.start(); |
CentOS
添加静态路由
本文中, docker网段如下:
172.17.10.0/24
172.17.11.0/24
分别对应宿主机IP
192.168.1.10
192.168.1.11
在.10主机添加11的静态路由
1 | sudo ip route add 172.17.11.0/24 via 192.168.1.11 dev eth0 |
在.11主机添加10的静态路由
1 | sudo ip route add 172.17.10.0/24 via 192.168.1.10 dev eth0 |
以上命令执行后立即生效, 在10可以ping通11的docker网段, 反之也一样, 不过重启后失效, 需要再次配置. 可以把上述路由规则写入网卡路由配置文件.
.10执行
1 | sudo vim /etc/sysconfig/network-scripts/route-eth0 |
添加一行
1 | 172.17.11.0/24 via 192.168.1.11 dev eth0 |
.11执行
1 | sudo vim /etc/sysconfig/network-scripts/route-eth0 |
添加一行
1 | 172.17.10.0/24 via 192.168.1.10 dev eth0 |