unifirst的技术博客

不断学习 不断进步

Java序列化

问题

最近在dubbo接口扩展上遇到了问题。dubbo的参数及返回对象,肯定是要可序列化的,即实现Serializable接口。需求是需要在接口参数中,加入一个字段,但是担心对原来的consumer产生影响,因此对java序列化进行了一下梳理测试。

顺便说下关于dubbo接口扩展碰到的这个问题,有几点收获:

  • 接口的传参,尽量用对象代替多个简单类型的参数,后者不便于加参数
  • 返回数据,同样尽量用对象代替简单类型
  • 更好的参数或返回数据扩展方案,应该是采用继承原有参数或返回类型的方式

序列化

java序列化,就是将java对象序列化为字节流,可以进行传递或者保存,在使用方对结果进行反序列化,从而获取到原来对象的属性值。

在需要将内存中对象保存到文件,或者直接传输对象时,会用到序列化。dubbo就是在provider和consumer之间传递对象数据。

Logback配置

Dependencies

Slf4j、log4j、logback关系介绍中所说,sif4j+logback日志体系,其dependencies:

  • slf4j-api (slf4j接口)
  • logback-classic (logback服务于slf4j的"驱动")
  • logback-core (logback日志实现)

logback配置

logback.xml示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
          <pattern>%d %p [%t] [%X{xxx}] - %m%n</pattern>
      </encoder>
  </appender>
  <logger name="console_logger" additivity="false">
      <appender-ref ref="console" />
  </logger>
  <logger name="com.xxx.xxx" level="INFO" additivity="false">
      <appender-ref ref="console" />
  </logger>
  <root level="info">
      <appender-ref ref="console" />
      <appender-ref ref="info" />
  </root>
</configuration>

Slf4j、log4j、logback关系介绍

日志框架

日志框架中,经常出现的slf4j、log4j、logback、slf4j-log4j、log4j-over-slf4j等等,让人混淆。为此,特意查找整理了一下,盗贴个图先:

日志架构图

上图中:

  • 接口:将所有日志实现适配到了一起,用统一的接口调用
  • 实现:目前主流的日志实现
  • 旧日志到slf4j的适配器:如果使用了slf4j,但是只想用一种实现,想把log4j的日志体系也从logback输出,这个是很有用的
  • slf4j到实现的适配器:如果想制定slf4j的具体实现,需要这些包

Intellij Idea 中启动多个tomcat Server失败问题解决

如我在由eclipse转intellij Idea中提到,由于由Eclipse刚投入Intellij的怀抱不久,对一些使用尚不熟悉,尤其这两天在Intellij中配置启动多个Tomcat出现了问题。

问题描述

Intellij idea中,为在本地调试两个系统之间的调用,配置两个本地tomcat server,设置不同的端口号,如8081和8082,Deploy中加入两个系统各自的Artifact xxx:war, Application context设置为“/“,即访问地址分别为http://localhost:8081/http://localhost:8082/

问题来了,分别单独启动两个server时都能成功;但是同时启动两个系统时,两个系统都会出现问题。其中较先启动的server报错为:StandardServer.await: Invalid command ‘’ received,然后会有一个系统报出异常,提示找不到xml或者properties等。

由eclipse转intellij Idea

设置字符集utf8

依次打开 File | Settings | Editor | File Encodings,将IDE Encoding、Project encoding 、default encoding for properties, 均选择utf8

设置unix换行符

依次打开 File | Settings | Editor | Code Style,将Line separator (for new files) 选择 Unix and OS X(\n)

同时可以设置行宽:Right margin (columns): 120

快捷键设置

关于idea的快捷键,一搜一堆,不多说。

主要的对应关系:(eclipse —— intellij)

ctrl+shift+R —— ctrl+shift+n
ctrl+shift+T —— ctrl+n
alt+← —— ctrl+alt+←
F3(ctrl+left button) —— ctrl+B(ctrl+left button)
Ctrl+D —— Ctrl+Y
Alt+Shift+Up/Down —— Ctrl+D
Ctrl+Shift+F —— Ctrl+Alt+L
Ctrl+Shift+O —— Ctrl+Alt+O
……

在File | Settings | Keymap 中,可以选择eclipse、vs等风格的快捷键

Count(*),count(1)和count(field)区别

印象中,count(key)比count(*)效率要高,因此在项目中用了count(field)的形式来统计行数。在code reivew时被指出应用count(*),于是查了下,并做了下简单测试,果然是我记错了,足见code review是多么有用啊。

count(*)

count(*)是对不为null的行进行计数,因此某一行只要不是所有列都为null(即只要是存在的记录),就会被计数。

mysql用explain查看其执行计划,count(*)会尽量利用具有以下特征的索引来提高性能:

  1. not null列
  2. 字段较窄

explain查看count(*)执行计划 如图所示,表主键id为bigint类型,count(*)时自动选择了int类型的gst_id索引。

count(field)

count(field)是对field列不为null的行进行统计,因此某一行的该列为null,则不予计数 。

同样用explain查看其执行计划,count(field)同样会尽量利用索引来提高性能,暂时发现有以下两种情况:

Spring中原型prototype的准确使用

实际问题

项目中,报表导出涉及到了在同一个类的两个不同方法中,都有相同的查询数据库的操作,一个方法是用于获取内容,一个是用于获取条数的,大概类似于这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
public class MyReportExporter extends AbstractReportExporter{
  @Override
    protected DataResp getData(Param param) {
        List records = myService.queryList(param);//查询db
        return wrapResp(records);
    }

  @Override
    protected int getCount(Param param) {
        return myService.queryList(param).size();//查询db
    }
}

由于是继承的父类统一处理,因此没办法单独优化这个步骤。在父类的统一处理过程中,会多次调用getCount方法,这样每处理一次,就需要多次查询数据库。

这是会想到,可以用私有全局变量将查询结果存起来。

博客建立之路

blog历程

托管博客

我先后用过新浪博客CSDN博客博客大巴还有其它一些不知名的小blog,当然还有QQ空间、校内等。每次想记些东西的时候,总是纠结于要记录在哪。久而久之,貌似处处都有blog,然而又处处不长久。

印象尤为深刻的,是以前选了一个很冷门的blog网站,自己偏安一隅地写着blog,结果有一天被通知网站要关闭了,之后export出来,我还用windows自带的加密给文件加了下密,还没来得及处理,后来的一次重装系统,再也无法解密了。

自建blog

有追求的人都自己搭建blog,看网上很多wordpress的教程,也搞过。当时穷学生一个,舍不得花钱买空间、买域名,找免费的空间和域名(比如tk),到时也出来过博客首页,到最后都不了了之。

github

毕业后进了国企,就再也没想过这档子事。两年后出来,感觉仿佛变了天,git?没用过啊。面试,还要最好有git的项目?瞬间感觉被落下好几个世纪。

好在终于进了个不大不小的互联网公司,开始兢兢业业地向大家学习。也终于逐渐知道了github是怎么回事,而且竟然了解了通过git可以搭建blog,这让我跃跃欲试。