月度归档: 2018 年 10 月

  • 利用H2的自定义函数更好的支持测试

    在写DAO层的单元测试时,用mock的写法意义不大,因为DAO层的测试更多的关注是Java对象的传递和生成SQL的正确性,所以需要链接真实的数据库。

    但是对于单元测试,真实的数据库是很重的,还要依赖于数据库本身的初始化和数据情况。H2作为一个基于Java开发的嵌入式数据库,支持在内存运行,也支持文件模式,非常适合用在单元测试。因为Spring Boot等框架对于这一块的支持很全面了,特别是Spring Boot默认的JDBC测试如果没有配置,会自动启动一个H2的内存数据库。

    H2虽然支持很多模式,可以尽可能的模拟不同的数据库,但是还是有一些支持是不完整的,一些数据库特有的方法H2是不支持的,比如MySQL的UNIX_TIMESTAMP。特别是业务上基本都有创建时间和更新时间这两列,unix_timestamp函数大量使用。

    这里可以使用H2的一个特性–用户自定义函数,支持两种使用方式

    1. Java方法预编译
    2. Java源代码直接使用

    这里来看看如何让H2支持unix_timestamp方法:
    首先新建一个新Java类

    public class H2Extended {
        public static int unix_timestamp() {
            return (int)(System.currentTimeMillis() / 1000);
        }
    }

    然后使用SQL创建一个别名,并将别名链接到我们的Java类的对应方法中

    CREATE ALIAS UNIX_TIMESTAMP FOR "com.huangyunkun.tool.H2Extended.unix_timestamp";

    然后在初始化Datasource的时候执行该SQL语句就行了

    参考

    http://www.h2database.com/html/features.html#user_defined_functions
    https://hyrepo.com/tech/h2-unit-test/…

  • 自动化发布sited插件

    自动化发布sited插件

    最近又在弄多多猫的sited插件了,写插件本身没啥了,写好本地build一下,然后发布到插件中心。

    这里我注意到一个版本问题,大多数情况需要自己手动改一下版本,最近在用阿里的云效CodePipeline,想到这里可以自动化一下。

    阿里云的CodePipeline其实就是jenkins,从环境变量中可以获取当前Pipeline号,可以把这个作为版本号。然后上传的化,其实官方的上传主要就是一个普通的上传,一个curl命令就可以搞定。

    echo "Publish to sited plugins site"
    head dist/index.sited.xml
    curl -v 'http://sited.noear.org/dev/dev.ashx' -F "file=@dist/index.sited.xml"

     …

  • 快速使用SQLAdvisor

    快速使用SQLAdvisor

    美团点评开源的SQLAdvisor可以帮助分析SQL语句,同时提供优化建议。

    遗憾的是官方没有提供快速的使用方法,需要自己安装依赖并编译,使用起来确实不是很方便。今天做了一个Dockerfile,直接把工具打到Docker中,这样就可以快速使用了。

    使用如下:

    docker pull htynkn/sqladvisor

    验证,输出帮助信息

    docker run -rm htynkn/sqladvisor --help

    …

  • Java诊断工具Arthas

    JVM自身提供了大量的诊断和调优工具,从jps、jstack、jmap、jhat、jstat、hprof等到visualvm等,提供了JVM进程信息,堆栈,堆内存等内容。

    Arthas是阿里开源的Java诊断工具,整合很多功能,而且是交互式。部分功能使用字节码增强技术,能够获取更多信息,而且还支持长时间后台监控,确实是一个不错的工具。

    Arthas安装比较简单,直接运行官方的sh脚本就行了,然后运行启动。这里要求本机必须有telnet,但是Mac默认已经移除了telnet,所以需要自己安装一下brew install telnet

    来几个使用示例

    查看类加载

    查看反编译代码

    这有一片文章比较详细的展示了Arthas的使用:

    http://hengyunabc.github.io/spring-boot-arthas-NoSuchMethodError/…

  • 说图

    说图

    什么图

    图是绘画表现出来的形象,图对比别的表现方式更生动,更直观。

    当然作为程序员常接触到的无非就是流程图,ER图,对象图,架构图等等。

    为什么

    工作中需要这些无非就两个用途,自己看;给别人看。

    我个人观点是图可以不绚丽,但是要清晰,可读,并且符合通用的图标标准。

    比如一个时序图,每个参与者是actor还是普通参与者,还是数据库等等,不同的图标代表不同的意义,可以用的比较简单,但是不能误用。

    工具

    画图工具比较多了,主要分两个大类,一是可视化绘制,即所见即所得那种,结果直接可控,而且细节调整度很大,但是操作比较繁琐,容易陷入细节,且工具比较多,付费的或者在线的比较多。

    Visio绝对是这种类型的一个佼佼者,唯一的缺点是平台限制。Mac世界可以用OmniGraffle,当然也是挺贵的。

    Linux世界可以用开源的Dia,我个人绝对还是不错的。

    在线版本的推荐Processon,使用免费,唯一的担心就是需要联网,其次就是有些是公司内部的东西,总不是那么放心。

    当然还有大神使用Excel或者Powerpoint也可以画出很牛的图,不过我觉得那个对于功底要求有点高了。

    另外一种是代码生成图像的,比较符合程序员的风格,可以直接通过代码生成最后的图,操作比较直接,缺陷是反馈比较慢,可调整型也不好。

    我曾经尝试过D3.js,这个控制层次很低,效果可好可坏,看个人了。

    我比较推荐PlantUML,这个画图比较直接,效果还过得去,亮点是对于程序员需要的相关图支持很好,比如UML,时序图,类图,组件图,部署图等等。

    具体的话有本地版本,可以转化为图片,也有在线免费版本,直接把代码转为图。

    比如下图:…