jdbc 性能优化之fetch & batch

缘起

朋友(下简称P)在公司经常955, 拿着三线城市8.5K/月的薪资, 让老板十分的不爽, 于是有一天, 老板交代给他一个任务, oracle11g 单表(未分表)5000w的数据. 其中一个字段是中文姓名, 然后老板希望他能新增一个字段为拼音字段, 并且这个字段的值为中文姓名的拼音. P觉得这还不简单,首先改表结构——新增一个varchar字段(下简称V)为拼音, 然后用原生jdbc拉取所有数据下来,然后遍历结果集, 然后逐条更新V字段. 逻辑异常的清晰和简单. 至于中文转拼音,既有成熟的API接口,也有丰富的本地jar包. 所以这就不是难事了. 写完开始跑, 一下子傻了眼, 大概是 12秒/1w条 的处理速度. 则这样算下来,约莫16小时才能搞定. 但是气人就气人在老板还安排一位17年毕业的小鲜肉也来做这个东西, 人家处理速度是 5秒/1w条. 老板很明显想diss一下我的这位朋友P. 于是他死扛了2天,来找我怎么扳回一局. 最后我通过使用fetch+batch参数将性能提高到了0.35秒/1w条. 着实帮他找回了面子.

Read More

学习vue的成果之cms系统

缘起

作为一个想吃全栈的java后端程序员, 一直认为前端已非09年之前的前端了. 正如某些前端自豪的称之为 大前端 时代的驾临. 所以我目前正沉下心来学习前端知识. 正好公司项目用到了vue.js 作为前端技术支撑. 所以学习了一下vue的知识. 并且做了一个小型的cms系统. 后端采用的是node.js. 参见Demo【1】

Read More

springmvc 整合 swagger2 遇到的坑

缘起

公司最近做项目, 负责一个小组件的开发. 前端小姐姐需要我提供swagger.json 文档. 原先做过boot和swagger2整合,但是没整过 swagger.json. 其实就是swagger2框架暴露的一个以json格式描述api结构的http接口. 路径是 /v2/api-docs

但是整合之后发现 swagger-ui.html 可以妥妥的访问,但是 /v2/api-docs 死活出不来.

Read More

Spring LDAP 官文阅读理解 纯干货

缘起

公司项目需要使用LDAP服务, 遂研究了2天. 昨天下午想写个LDAP分页, 百度万千, 结果都是抄来抄去的不可用的代码. 感觉博客的作者自己都没弄懂Spring LDAP的API分类就瞎抄一气. 我极为光火. 遂花了一晚上阅读了Spring LDAP 2.3.2 的官方文档. 豁然开朗, 并且写了基于最新的spring-ldap2.3.2分页的demo. 关于参考文档,见【1-3】

本文并不想仔细分析其中的API,其实这一点直接去看官文就很容易看懂了. 英文不好的童鞋直接看中文翻译的1-5章. 秒懂. 比百度搜的抄来抄去作者都不知所谓的博文好上百倍.

Read More

从使用 ldap 想到的 jndi 机制分析

缘起

​ 最近做总部定制,一个组件开发任务. 要查询数据库,但是总部对接人说这边不提供直接数据库访问,只暴露ldap服务. 听过没用过是最令人兴奋的啦. 于是兴奋的花了一天时间了解了ldap, 并且写了ldap 的 demo(参见【1】). 但是依旧觉得不过瘾,因为写demo的时候发现了JNDI的影子. JNDI 最初是在学jdbc的时候,学过一种使用jndi技术将mysql数据源使用tomcat容器之类的Servlet容器管理起来. 然后在代码里面直接使用统一的JNDI API获取数据源即可. 而不论数据源是mysql数据源还是oracle数据源. 现在发现ldap、JDK内置DNS查询程序DnsContextFactory、甚至 MQ的资源都可以使用JNDI技术管理起来. 于是就产生了浓厚的兴趣想了解JDK是怎么做到的.

Read More

jdk 的 URL 源码浅析

缘起

工作中遇到了ldap使用. 后来自学了一下,不可避免的遇到了jndi这个老朋友. 后来仔细一想,jndi只需要初始化一个context就可以想拿啥就拿啥了,觉得和jdk的spi机制以及java.net.URL的构造器很像. 你想啊,URL背后其实是URLConnection, 而它本身是一个抽象类, 可以根据你传入的url的scheme自动选择使用的URLConnection子类. 这本质上都是类的动态加载和服务发现. 关于JDK的spi机制可以参见我写的一篇文章【1】. 关于jndi我会再写一篇文章. 最后你会发现, jndi、spi、URL 这三个东西其实用的核心思想是完全一样的.

本质上都是为了打破父委托机制而引入的线程上下文类加载器啊!

Read More

mapreduce程序提交job源码分析

缘起

继续入门, 运行mapreduce的helloworld程序——wordcount. 运行mr程序的方式有两种

  1. 本地模式,你导入的hadoop的jar包包括了本地模拟器
  2. 集群模式, 打成(普通)jar包(未必要是可运行jar包),扔到hadoop集群上使用hadoop jar 命令运行

这不是本文讨论的重点, 本文讨论的重点在于最后提交(job)

1
job.waitForCompletion(true);

本文就在于分析其提交过程

Read More