知尽Java第几重

知尽Java第几重

JAVA中BIO、NIO、AIO的分析理解

理解 IO

输入输出(IO)是指计算机同任何外部设备之间的数据传递。常见的输入输出设备有文件、键盘、打印机、屏幕等。数据可以按记录(或称数据块)的方式传递,也可以 流的方式传递 。

所谓记录,是指有着内部结构的数据块。记录内部除了有需要处理的实际数据之外,还可能包含附加信息,这些附加信息通常是对本记录数据的描述。

同步和异步

同步

  • 概念:指的是用户进程触发 IO 操作并等待或者轮询的去查看 IO 操作是否就绪。
  • 例子:每天要吃饭,下班后自己跑去菜市场买菜,回来在做饭,所有的事情都是自己一件接着一件执行的。

阅读剩下更多

默认配图
知尽Java第几重

mysql+mybatis+druid批量更新数据时的配置

批量更新SQL

为什么要批量更新

很多时候,我们都是单条更新数据,或者是批量更新统一字段相同值。

但有些情况下,为了某些场景,我们通常需要批量更新某一段时间的或者全量的数据。比如,某个业务线需要增加一个字段,但是这个字段需要根据已存在的数据计算得出,并不是保持一致的时候,需要批量更新。再比如,某些傻叉设计的用户密码是明文入库,当你发现的时候,有必要加密处理。

批量更新逻辑

先看看一段批量更新mybatis表达式:

1
2
3
4
5
6
7
8
<update id="updateUserPassword" parameterType="com.zhoujunwen.gaea.dal.po.User">
<foreach collection="list" separator=";" item="user">
<if test="user.pass != null and user.pass !=''">
update box_user set pass = #{user.pass}
where id = #{user.id}
</if>
</foreach>
</update>

阅读剩下更多

默认配图
知尽Java第几重

Sikuli的App类中文手册

一般而言,你可以选择使用类的方法(e.g. `App.open("application-identifier")`)或者先创建一个类的实例接着使用该实例的方法(e.g. 先`myApp = App("application-identifier")` ,之后 `myApp.open()`)。(对于二者)没有一个优先级的用法推荐,唯一真正的不同之处在于,当使用实例方法时,可能会节省一些资源,因为使用类的方法可能会产生更多的中间对象。因此,如果您频繁地使用相同的应用或者窗口,使用实例方法也许更合适(注:transparent的意思为"透明的;显然的;坦率的;易懂的",但译者认为此处理解为“合适的”最好)。

在实例创建时,使用给定的文本扫描进程列表以查找可执行文件的名称。如果找到了,应用程序将被初始化为响应的信息(PID,可执行文件,主窗口最前面的窗口标题)。所以,你可以直接访问此应用实例,查看应用是否运行(`isRunning()`),是否有窗口(`hasWindow()`),获取主窗口的标题(`getWindow()`)以及获取进程ID(PID)(`getPID`)。

阅读剩下更多

默认配图
知尽Java第几重

Java日志Log4j或者Logback的NDC和MDC功能

NDC和MDC的区别

Java中使用的日志的实现框架有很多种,常用的log4j和logback以及java.util.logging,而log4j是apache实现的一个开源日志组件(Wrapped implementations),logback是slf4j的原生实现(Native implementations)。需要说明的slf4j是Java简单日志的门面(The Simple Logging Facade for Java),如果使用slf4j日志门面,必须要用到slf4j-api,而logback是直接实现的,所以不需要其他额外的转换以及转换带来的消耗,而slf4j要调用log4j的实现,就需要一个适配层,将log4j的实现适配到slf4j-api可调用的模式。

说完基本的日志框架的区别之后,我们再看看NDC和MDC。

不管是log4j还是logback,打印的日志要能体现出问题的所在,能够快速的定位到问题的症结,就必须携带上下文信息(context information),那么其存储该信息的两个重要的类就是NDC(Nested Diagnostic Context)和MDC(Mapped Diagnositc Context)。

阅读剩下更多

默认配图
知尽Java第几重

三个annotation类型(RetentionPolicy,ElementType)

第一部分

了解一下java1.5起默认的三个annotation类型:
@Override: 只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
@Deprecated: 建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
@SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭.

第二部分

先讲一下annotation的概念,再来讲一下怎样设计自己的annotation.

首先在jdk自带的Java.lang.annotation包里,打开如下几个源文件:

1、源文件Target.java

1
2
3
4
5
6
@Documented  
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}

阅读剩下更多

默认配图
知尽Java第几重

关于dubbo配置引起的线上事故报告

很抱歉,昨天(3.28)晚上8点多clan以及相关业务上线,上线测试回归,一切正常。晚上10点过几分,用户反馈系统出错,排查之后发现线上两台clan均挂掉。10:10:34重启暂时恢复线上业务。

查询日志发现,在2017-03-28 21:59:54.793的时候,dubbo provider不能注册服务。此时,tomcat的进程已经down掉了。后续的日志都是一些不能注册或者不能订阅的错误,甚至是调用方法时service没有实例化的错误,应该属于tomcat down掉后,dubbo的进程还没有shutdown(从时间上可以看出,具体看后面的两段日志[1])。

后续从日志中,早于服务挂掉的时间,发现有dubbo线程池耗尽的警告。

阅读剩下更多

默认配图
知尽Java第几重

mybatis使用spring-druid数据源连接池配置log4j打印sql语句以及开启监控平台

引言

作为程序员,开发工程中,一套利于测试或者监控的工具很重要,mybatis默认没有提供log4j的打印sql语句的配置。

这对于开发rest服务,提供接口的开发者而言,是在很不好做,再加上mybatis很灵活,使用脚本动态生成sql语句,因此,有时候真不知道运行的sql是不是我们所期望的,过滤的条件是否起作用。

所幸,德鲁伊监控平台是个不错的选择,在性能方面druid连接池也比spring原生的要好,因此也是很多企业开发的首选数据源配置。

在引言阶段,我们先看看目前我配置的结果是否是你想要的,如果不是你所期望的,就别浪费时间往下面看,毕竟大家都时间有限,没必要花费时间看一些对自己没用的东西。

阅读剩下更多

默认配图
返回顶部