在做金融类系统处理金额数据时,double提供的精度位数有限,进行大量资产的核查清算时,容易因位数过多产生精度不够的情况。
Java的BigDecimal在这方面支持较好,可以提供任意位的精确计算,不过其效率一般,为了探究与double的性能差距,简单测了一亿次迭代情况下的加减乘除运算,进行比较,本次试验使用我的渣渣办公本,i5-2410m 4G内存。
通过测试,BigDecimal与double的性能差距在100倍这个量级,测试一亿次迭代数据,处理效率尚可在可接受范围。
结果图(单位毫秒):
在做金融类系统处理金额数据时,double提供的精度位数有限,进行大量资产的核查清算时,容易因位数过多产生精度不够的情况。
Java的BigDecimal在这方面支持较好,可以提供任意位的精确计算,不过其效率一般,为了探究与double的性能差距,简单测了一亿次迭代情况下的加减乘除运算,进行比较,本次试验使用我的渣渣办公本,i5-2410m 4G内存。
通过测试,BigDecimal与double的性能差距在100倍这个量级,测试一亿次迭代数据,处理效率尚可在可接受范围。
结果图(单位毫秒):
虚拟机的mac升级到10.12后,分辨率被锁定1024x768,直接vi编辑配置文件无法保存,在vmware中共享的文件夹也无法打开。
原因是10.11之后增加了System Integrity Protection (SIP)功能,禁止让软件以 root 身份来在 Mac 上运行。
好在有办法关掉。
常规办法是在引导时按住command+R键,进入recovery environment,在终端进行操作,比如这样:
How to turn off System Integrity Protection in El Capitan
Click the menu.
Select Restart...
Hold down command-R to boot into the Recovery System.
Click the Utilities menu and select Terminal.
Type csrutil disable and press return .
Close the Terminal app.
Click the menu and select Restart... .
不过虚拟机好像不太好正确按出来,可以尝试在引导时按住command键(普通键盘alt键)进入boot manager,然后选择Enter setup ——> Boot from a file ——> Recovery HD[PciRoot(0x0)/…] ——> ——> boot.efi
Spring boot 确实降低了开发一个符合现代架构Java Web应用的门槛,不过由于普及范围不太广,资历也还比较年轻,相关文档和Spring MVC那套比起来相当贫乏。
所以可能会趟到一些坑。
实话讲,Spring boot开发一个Java Web应用是十分称职的,不论是做Restful API提供纯后台服务,还是使用MVC加上一些模板渲染引擎,Spring boot都可以胜任,并能简单的、出色的完成工作。与Spring进行一大堆配置相比,Spring boot的配置非常简单。数据连接方面,Spring boot data组件涵盖了大多数应用场景,jpa写到飞起,默认的tomcat连接池也可满足一般需求。
我最近一个需求是进行HBase数据检索。
spring-data-hadoop的hbaseTemplate挺强大的,我初步想集成进来,不过这个组件现在Spring boot里没有办法做到简单配置,还需要写xml的配置文件并显式生效。官方现在尚无简单进行hbase集成的文档和参考案例,相关的讨论可以看这两个帖子:
http://stackoverflow.com/questions/31381615/use-hbase-with-spring-boot
http://stackoverflow.com/questions/24795097/how-to-use-hbase-with-spring-boot-using-java-instead-of-xml
不过hbase原生api使用起来也不麻烦,我要开发的这个应用十分简单,心想索性就引入原生的包直接写就好了。
所以我引入了hbase-client和hadoop-hdfs两个包,就像这样
jodatime依靠其方便的api和与Data无缝转换,成为java开发负责时间逻辑的不二之选。
当jodatime作为Entity的属性自动转换时,一般用到jadira.usertype
在实体类中使用jodatime需要引入jadira.usertype
自动转换有两种配置,一种是在属性上加注解:
// Will be mapped as DATETIME (on MySQL)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime createTime;
// Will be mapped as DATE (on MySQL), i.e. only date without timestamp
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
private LocalDate birthdayDate;
一种是做全局配置
spring boot的app.properties配置如下:
spring.jpa.properties.jadira.usertype.autoRegisterUserTypes = true
这样在实体类中就可以直接使用jodatime的DateTime类型,在存取数据库的时候会自动完成类型转换
// Will be mapped as DATETIME (on MySQL)
private DateTime createTime;
// Will be mapped as DATE (on MySQL), i.e. only date without timestamp
private LocalDate birthdayDate;
不过有一个问题,当数据库保存实体时,时间少了8个小时,2016-06-20 00:00:00存到数据库中变成了2016-06-19 16:00:00,看来是丢了时区信息。