JVM入门
引言JVM(Java Virtual Machine)Java 虚拟机是整个 Java 平台的基石,是 Java 系统实现硬件无关与操作系统无关的关键部分,是保障用户机器免于恶意代码损害的屏障。Java开发人员不需要了解JVM是如何工作的,但是,了解 JVM 有助于我们更好的开发java 程序。近些天一直在看周志明的《深入理解Java虚拟机》这本书,这本书写的堪称经典,对于JVM的学习非常有帮助。
运行时数据区域JVM将内存主要划分为:方法区、虚拟机栈、本地方法栈、堆、程序计数器。JVM运行时数据区如下:
程序计数器(线程私有)程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
由于Java虚拟机的虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的 ...
Java生成PDF
引言在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同、证书等。方便用户查看,下载,打印。目前常用的解决方案是,把相关数据信息,生成对应的PDF文件返回给用户。之前有写过一篇博客关于JAVA实现HTML转PDF,不同场景下的业务不同,现在需要使用PDF生成证书,这篇博客主要介绍iText的使用。
本博客项目地址:https://github.com/mx-go/java_pdf_demo
iText介绍iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个JAVA类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、HTML文件转化为PDF文件。
iText 官网:http://itextpdf.com/
iText 开发文档: http://developers.itextpdf.com/developers-home
iText目前有两套版本iText5和iText7。iText5应该是网上用的比较多的一个版本。iText5因为是很多开发者参与贡献代码,因此在一些规范和设计上存在不合理 ...
分布式下ID生成算法 SnowFlake
引言在做系统开发时,系统唯一ID是我们在设计一个系统的时候经常遇到的问题,也常常为这个问题纠结。生成ID的方法有很多,适应不同的场景、需求及性能要求。所以有些比较复杂的系统会有多个ID生成策略。在这里总结一下常用到的ID生成策略。
数据库自增长序列或字段最常见的方式,利用数据库,全表中唯一。如MySQL的AUTO_INCREMENT。
优点
简单,代码方便,性能可以接受。
数字ID天然排序,对分页或者需要排序的结果很有帮助。
缺点
不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理。
在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成。有单点故障的风险。
在性能达不到要求的情况下,比较难于扩展。
如果遇见多个系统需要合并或者涉及到数据迁移会相当痛苦。
分表分库的时候会有麻烦。
优化方案针对主库单点,如果有多个Master库,则每个Master库设置的起始数字不一样,步长一样,可以是Master的个数。比如:Master1 生成的是 1, 4, 7, 10,Master2生成的是2, 5, 8, 11,Master3生成的是3, 6, 9, 12。 ...
Java备份和还原MySQL数据库
引言 在项目中经常会用到Java程序备份和还原MySQL数据库的内容,都是大同小异,但程序也会出现各种各样的问题(运行时异常,乱码等)。实现上都是用Runtime执行MySQL的命令行工具,然后读写IO流数据;也有可能是由于使用Java的Runtime来实现备份还原功能,而由于大家的运行时环境有差异才导致代码运行不成功。在这里记录一下自己使用的工具和方法。
使用MySQL自带工具备份备份使用MySQL的mysqldump命令来实现,示例代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455final static Logger logger = LoggerFactory.getLogger(MySQLDatabaseBackupAndRestore.class); /** * Java代码实现MySQL数据库导出 * * @param hostIP MySQL数据库所在服务器地址IP * @param ...
系统中功能点的版本控制
引言 开发过程中我们会使用版本控制工具,如SVN、Git等。但是我们一样会遇到一种情形:在一套试题系统中,有新建题目、编辑题目、删除题目等功能,且题目可以被多个人修改,每人修改一次即是一个版本。现在的需求就是需要记录每一次修改的详细信息,每次版本之间的差异,甚至还可以版本回滚。
例如题目编号为20170919170800000061的题目被A创建,依次被B、C、D各修改了一次,此时需要比较B和A间的差异、C和B间的差异、D和C间的差异,到最后审核阶段如果B 的版本比较符合,则需要把试题版本内容回滚到B版本作为最后的版本。
仔细分析一下题干,我们的需求是1.比较版本的差异,2.版本的回滚。之前有考虑过两种方案:
修改时在前端进行比较,只记录版本的差异,后台只需要进行存取即可。
把所有版本信息全部存储在数据库,在请求时后台进行比较差异。
第一种方案带来的问题是没法进行版本回滚,只记录下来了差异,回滚时将会是灾难,那么第二种方案才是较合适的选择。
下图是数据库中的版本修改记录
题目的所有信息全部存储在itemJson中,比较版本间的差异即是比较版本间的itemJ ...
Spring+Mybatis之Mapper热部署
引言 Spring+Mybatis经常用,在项目中最痛苦的就是修改mapper文件的时候需要重启一下项目,每修改一次就需要重启一次项目。项目小还好,如果项目大,重启一次项目简直是要命。所以,去网上查资料看有没有办法让mybatis热部署,每次更新mapper文件不需要重启项目。
功夫不负有心人,终于找到了,这玩意只要发现mapper文件被修改,就会重新加载被修改的mapper文件。且只加载被修改的mapper文件!这个可省事了,效率又高,简直爽到爆。
创建MapperRefresh刷新类在src下创建一个util包,包下面创建一个类,类名为:MapperRefresh
代码为下面的一串,注意修改下mybatis-refresh.properties 的路径。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 ...
Spring-AOP两种配置方式
引言AOPAOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为”Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用”横切”技术,AOP把软件系统分为两个部分: ...
跨页面(Tab/Window)通信的几种方法
今天开发一个功能遇到一个需求,在A页面点击查看详情后打开B页面进行修改或删除,删除后B页面关闭,然后刷新A页面里面的数据。相当于就是两个页面之间进行通讯,作为后端的我第一想法是利用webSocket 进行通讯,之后通过谷歌和百度找出了更为简便的方法。
利用webSocket进行通讯 第一想法是这个,但是这样的话工作量巨大而且还需要后端支持,太麻烦了,对于我这种懒人直接就放弃了,去寻找有没有更简便的方法。
定时器不断检查cookies变化在stackoverflow上看到一个方案,大致思路是:
在页面A设置一个使用 setInterval 定时器不断刷新,检查 Cookies 的值是否发生变化,如果变化就进行刷新的操作。
由于 Cookies 是在同域可读的,所以在页面 B 审核的时候改变 Cookies 的值,页面 A 自然是可以拿到的。这样做确实可以实现我想要的功能,但是这样的方法相当浪费资源。虽然在这个性能过盛的时代,浪费不浪费也感觉不出来,但是这种实现方案,确实不够优(zhuāng)雅(bī)。
localStorage的事件功夫不负有心人,后来发现 w ...
