IDEA-Scratches的一个问题

新建一个scratch,编写如下代码:

1
2
List<String> list = Arrays.asList("11 22","22 11","32 44");
list.stream().map(item->item.split(" ")).flatMap(Arrays::stream).distinct().collect(Collectors.toList()).forEach(System.out::println);

其中Arrays::stream,编译错误,提示Cannot resolve method ‘stream’
在工程中编写则无此错误。

IDEA版本:2018.3.2 UE版
JDK:jdk1.8.0_121

MySQL 事务查询

查询事务
SELECT * FROM information_schema.INNODB_TRX;

查询正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

查询等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

查询进程
show PROCESSLIST;

查询是否锁表
show OPEN TABLES where In_use > 0;

Maven Settings 中的一些容易混淆的概念

首先是repositories,其中定义了一些远程仓库(私服)。本来是可以直接定义在POM.xml ,但是由于一个公司通常多个项目都是使用的同一个远程仓库(私服)。为了每个项目不重复定义。所以可以统一配置在settings.xml。由于settings下不能直接定义repositories所以采用了profiles。同时也可以使用profiles做不同环境下的配置切换。

容易混淆的是mirrors,配置多个mirror,并不是每一个都会生效,始终只有第一个有用。另外mirrors 跟profiles没有什么直接关系,有关系的是repositorymirrorOf 中配置的是repository id(支持表达式)。一般我们mirror的都是central这类官方,因为mirror的主要作用就是解决不同网络环境下,这种官方的或者第三方的仓库速度问题。如果你有私服,然后直接mirrorOf * 到了阿里云的镜像库,那么你私服的Jar可能就访问不到了。

maven找Jar的路径大概是,本地仓库>各个远程库,如果配置了镜像,则走镜像库。

server配置的是maven私服账号密码信息,用于分发jar到私服时认证,通常在pom文件中会定义distributionManagement,其中repository id 必须和server的id一致。
分发指的是deployinstall只会在本地库中存在。

MySQL可重复读和幻读

可重复读描述的是一个事务在处理数据时,多次查询此数据得到的结果是一样的。MySQL的InnoDB存储引擎通过多版本并发控制(Multi_Version Concurrency Control, MVCC)机制来解决该问题。
幻读描述的是MVCC不能阻止插入新的数据,导致多次查询时数据记录不一致。

CAP个人浅显的理解

分布式系统为了保证数据不丢失,于是我们将数据做了多个副本放在了不同的服务器上【Partition tolerance(分区耐受性): 可靠性)】,并且保持更新多个副本,但是在更新副本的时候,可能由于网络等诸多原因导致其中一个或多个副本无法更新,此时就面临了一个选择:更新剩下的副本?or 都不更新了?
选择更新剩下的副本,则是选择了【Availability(可用性): 好的响应性能】,此类型系统保证了AP。
选择都不更新了,则是选择了【Consistency(一致性): 数据一致更新】,此类型系统保证了CP。

以上为个人片面且浅显的理解。

UUID优化方案

数据ID生成方案中UUID相对来说是最简单的,但是其也有不少缺点:

1.没有排序,无法保证趋势递增。
2.UUID往往是使用字符串存储,查询的效率比较低。
3.存储空间比较大,如果是海量数据库,就需要考虑存储量的问题。
4.传输数据量大
5.不可读。

常见优化方案:
1.优化字符串为BigInteger

1
2
3
4
5
6
7
8
private static BigInteger pair() {
UUID myuuid = UUID.randomUUID();
//UUID长度为128位
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(myuuid .getMostSignificantBits());
bb.putLong(myuuid .getLeastSignificantBits());
return new BigInteger(bb.array());
}

2.去掉符号:

1
2
3
4
5
6
7
8
private static BigInteger pair(UUID uuid) {
BigInteger value1 = BigInteger.valueOf(uuid.getMostSignificantBits());
BigInteger value2 = BigInteger.valueOf(uuid.getLeastSignificantBits());
if (value1.compareTo(value2) < 0) {
return value2.multiply(value2).add(value1);
}
return value1.multiply(value1).add(value1).add(value2);
}

flume同时使用KafkaSource、KafkaSink导致的问题

KafkaSource 配置topic:topic1
KafkaSink 配置topic:topic2
从topic1拉取数据,经过简单处理后发到topic2
但是你会发现flume一直在循环读写topic1
原因就是KafkaSink中的这段代码:

1
2
3
if (eventTopic == null) {
eventTopic = topic;
}

首先从headers中获取TOPIC_HEADER(topic),然后优先使用。然而在KafkaSource中则会将topic1 PUT到Header中,所以导致循环读写topic1。

如何解决呢?

你可以重新KafkaSink,改掉上面那段代码。

或者配置一个拦截器,将KafkaSource 写到Header中的topic给替换掉:

1
2
3
4
agent.sources.so1.interceptors.i1.type = static
agent.sources.so1.interceptors.i1.key = topic
agent.sources.so1.interceptors.i1.preserveExisting = false
agent.sources.so1.interceptors.i1.value = topic2

《Java性能-权威指南》 笔记

在做性能测试时,需要确保输入参数是确定的,否则处理参数还会带来一定的性能损耗。

JVM主要接受两类标志(少数例外):布尔标志和附带参数标志。

  • 布尔标志语法:-XX:+FlagName表示开启,-XX:-FlagName表示关闭。
  • 附带参数标志语法:-XX:FlagName=something。例如-XX:NewRadio=N
阅读更多

HashMap和ConcurrentHashMap中的initialCapacity

HashMap 默认有一个初始大小(initialCapacity),这个初始大小是16。
在各种开发规范手册中都可以看到会建议设置这个大小。
例如:new HashMap(3);
那么我们设置了初始容量为3,HashMap的容量真的会初始化为3了吗?
答案是否定的。
为了提高Hash效率,Java中会重新计算这个值,获得一个>3的最小2的N次方,大于3的最小2的N次方就是4(关于为什么请参照
https://www.zhihu.com/question/28562088/answer/111668116)。
这个4是怎么来的呢?

阅读更多