前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Web技术经验总结(十三)

Java Web技术经验总结(十三)

作者头像
阿杜
发布2018-08-06 11:30:20
5310
发布2018-08-06 11:30:20
举报
文章被收录于专栏:阿杜的世界
  1. 设计表的时候,主键的选择,如果业务字段是bigint类型,可以含义不会改变,则可以用作主键;更普遍的做法是,选择单独的id字段作为表的主键(为了考虑后续水平扩展的需求,要求全局唯一,即用发号器获取);业务主键如果是字符串类型的,也不能作为表的逻辑主键使用,因为太占用空间、效率低。关于这个主题的探讨,可以参考:数据库的唯一标示符(ID)的选择
  2. 在Mybatis中,一般会将SQL语句以K-V对写在xxxMapper.xml文件中,关于$和#两种符号的区别:$符号表示MyBatis在动态替换过程中的字符串替换;#符号是参数占位符,表示SQL语句的参数替换。参见:mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译
  3. Mybatis经典文章:《终结篇:MyBatis原理深入解析(一)》,这个系列的其他两篇文章也非常不错。
  4. 千万级的数据集合如何去重?思路1:最朴素的思路是利用Java 8的集合API进行操作,这种情况下,如下程序跑完一次去重需要6s(我的机器是Mac Pro),那么总共需要6000s,大概两个小时;思路二:如果两个集合的字符串序列都能有序,就可以用位图算法进行标记,但是发现瓶颈在排序;思路三:借助外部系统,例如MySQL,将这批数据存放在表中,并建立索引,借助一个版本号进行标记。在实际项目中,我们评估了MySQL进群的处理能力,选择了思路三,这和思路二一样,都是换一种数据结构去思考和解决
代码语言:javascript
复制
package org.java.learn.collection;
import java.util.*;
public class ARemoveBListExample {
    public static void main(String[] args) {
        Set<String> aSet = new HashSet<>();
        Set<String> bSet = new HashSet<>();
        for (int i = 0; i < 10000; i++) {
            String str = UUID.randomUUID().toString();
            aSet.add(str);
            bSet.add(str);
        }
        for (int i = 0; i < 10000000; i++) {
            aSet.add(UUID.randomUUID().toString());
        }
        //求A集合到B集合的差
        long start = System.currentTimeMillis();
//        List<String> result = aSet.parallelStream().filter(a -> !bSet.contains(a)).collect(Collectors.toList());
        aSet.removeIf(a -> bSet.contains(a));
        long end = System.currentTimeMillis();        System.out.println("cost: " + (end-start) + "ms, result size:" + aSet.size());
    }
}
  1. 在构建REST服务时,需要提供统一的异常处理、统一的请求参数、统一的响应结构,利用基于注解的AOP可以实现这个功能。
  2. BasicThreadFactory 的实例不会直接创建线程,其内部使用的builder构建器负责创建线程,通过构建器模式可以为要创建的线程配置很多属性:命名规则、是否精灵进程,以及线程的优先级等熟悉。
  3. 在业务开发中,会有如下的应用场景:服务A有个线程池不断消费来自MQ推送的消息,只有消费完给MQ发出response之后才能继续消费新的消息;为了不让消息堆积,我们需要尽可能加快这个线程的处理能力,必要的时候需要将该线程中能异步做的工作异步掉,例如请求远端的HTTP接口。这种场景下,就需要使用httpclient的异步调用,直接使用httpclient有点麻烦,最近接触的vert.x提供了一个不错的方法,可以参考:Vert.x HTTP Client
  4. MyBatis应用技巧:传入多个参数时,在xml文件中如何获得参数?参考:MyBatis传入多个参数的问题
  5. MyBatis应用技巧:如何在应用程序中配置多数据源?参考:MyBatis多数据源配置(读写分离)
  6. 利用curl测试自己的服务接口:curl发送POST请求
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.11.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档