发表于: 2018-04-25 20:34:00
5 476
今天完成的事情
学习log4j
这其实是4月21日完成的。前期学过一部分log4j,后来中断了,今天先把这一块学完。刚开始学习的时候一直弄不明白log4j里面的level跟我平时调试程序时控制台输出的错误日志中的信息是否是一回事,后来看了几个例子,随便找了几个Spring框架中的源代码,看到里面就是通过执行logger对象的对应等级方法来输出的日志,一下子就理解了。同时也就理解了maven中
- 通过命令行加-X后缀的意思就是让maven的输出debug级别的日志,即maven框架中对应的类中的logger对象的debug(XXX)方法得到执行。
- 平时不添加-X后缀就不会输出这些日志。实质就是debug(XXX)方法没有得到执行
关于logger对象的继承关系
带名字的logger对象继承rootlogger对象的所有配置,并且可以覆盖rootlogger中的定义和增加新的定义。
首先要编写配置文件
在配置文件中可以
- 指定rootlogger的输出目的地以及布局方式等属性。
- 指定带名字的logger对象的输出目的地以及布局方式等属性。
然后在java编程中使用日志功能
- 首先加载配置文件
- 如果没有配置文件,就使用BasicConfigurator.configure ()获取默认配置
- 然后获取logger对象
改造程序,添加日志功能
具体哪个级别日志该用到什么地方暂时还不是很清晰,以后见得多了,多分析平时编程时使用的框架中的日志信息使用的等级,应该会更加明白各个level具体的应慎用场景。下面我自己分类设置的日志级别我自己也没把握,有不对的地方麻烦师兄指点一下,谢谢啦
设置debug级别日志
原来没有使用日志功能的时候,为了能直观的在控制台看到操作信息,在service实现类中的每个方法是都使用system.out.pringln(XXX)方法输出该方法操作信息到控制台

现在可以通过日志来输出。对应当前的的实例来说就是写在调用service实现类对象的main方法中,采用debug级别来显示自己的每一步操作,比如插入或者删除了哪条数据等。这样平时不用输出这方面的日志,如果出错可以开启debug来根据获得的日志信息来调试。

设置info级别日志
待定
设置warn和error级别日志
现在使用Spring+mybatis操作数据库,参考师兄的日报,我设计了如下两个例子,这两个例子有不同的实现方式
向唯一约束的表中插入重复数据(设置为error级别)
user表中添加了主键约束,如果插入相同id值的数据条目,最底层的jdbc操作会抛出异常,此时可以在catch块中捕捉异常然后添加日志记录。我认为此时自定义日志中不能直接说是因为id重复导致无法插入数据,仅仅说明插入数据失败即可
- 通过getMessage()方法能够获取到具体的出错原因,包括因为不允许插入重复数据而报错,自定义日志中就不用再说了
- 也可能其他原因导致抛出异常,不一定是因为id重复的原因。如果自定义日志直接说是id重复导致出错,会产生误导。

更改表格中不存在的数据(设置为warn级别)
如果目标id值的数据条目实际并不存在,此时作为最底层的jdbc执行update语句,操作的结果仅仅是操作无效,但并不会抛出异常,也就无法通过try-catch块捕获异常并添加自定义日志。那怎么办?在update之前先判断是否有目标id值的数据
- 如果有——就执行update语句
- 如果没有——添加自定义日志,提示说没有目标id值的数据,插入不成功

完整的程序如下

实际运行后结果如下
首先插入id从0-6的数据,这样后面
- 更改id=8的数据就提示失败,因为此时不存在id=8的数据
- 插入id=3的数据也提示失败,并且输出的getMessage()信息中已经包含了“Duplicate entry '3' for key 'PRIMARY';”的提示,所以

开始任务1-25
要求“测试一下不关闭连接池的时候,在Main函数里写1000个循环调用会出现什么情况”。目前没有手动提交事务,事务都是自动提交的。在main方法体内的内容执行结束之前,也就是main线程结束之前,所有的数据库操作都是使用的从连接池中获取的同一个connection对象(该connection对象是与当前线程绑定的)。我感觉关键点在于这1000个循环调用指的是调用什么东西?如果是开启1000个新线程的话那情况就不同了吧。
这个任务的目的有点理解不透,麻烦师兄指点一下,暂时先不做了。
开始任务1-26
任务要求“测试一下连接DB中断后TryCatch是否能正常处理”。这个我的理解是程序执行到try块中时中断db连接,然后查看catch块能否得到执行吧?我在try块中的添加断点,然后进入debug模式。当执行到try块中的语句的时候停止mysql服务。
循环插入从0到6共7条数据,然后在插入id为2的数据之前停止了mysql服务
停止mysql服务之前

停止mysql服务之后
The last packet successfully received from the server was 32,761 milliseconds ago. The last packet sent successfully to the server was 2 milliseconds ago.
; SQL []; Communications link failure
The last packet successfully received from the server was 32,761 milliseconds ago. The last packet sent successfully to the server was 2 milliseconds ago.; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 32,761 milliseconds ago. The last packet sent successfully to the server was 2 milliseconds ago.
[main]ERROR [com.kaiji.mybatistest.controller.Maintest0] - 插入id为2的数据失败
一大堆报错之后,在最后面发现catch块得到了执行(最后一行)。看了师兄的日报知道了这个任务的考察目的是关于异常的层层抛出和捕获。java程序的总体运行过程实质是方法的层层调用,那外层能够捕获其调用的方法抛出的异常,反之则不可以。
所以问题的关键就是理清楚我的try-catch块的方法调用层次。目标报错的日志看不太懂,但宏观上感觉db断开后抛出的异常应该在我当前try块中的语句的底层吧,我这里catch块捕获到也是理所当然的吧。只有真正弄清楚下图中方法的调用层次才会真正明白,但这是我目前做不到的

开始任务1-27
检查一下自己的代码是否符合规范,如果DB的表格有改动,应该改哪些内容,需要多久。
关于代码规范性
- 一方面上结构上,分层是否合理,在框架使用上是否实现了每层之间的解耦
- 另一方面编程规范上,前几天下载了阿里巴巴的java开发手册,里面规范了java编程的一些列细节,包括命名规范等很多细节。暂时还没怎么看,但感觉有时间还是需要看看,感觉很有必要。
当前自己代码的规范性暂时没去精心修饰,先追一追进度吧。
关于db的表格修改
java编码中与表格相关的部分就是
- model类需要修改。model类依然与表格字段一一对应。那么修改表格就需要相应修改model类的属性,set或者get方法,以及构造方法
- 然后就是所有操作sql语句中涉及到具体的表格字段的操作都需要修改。不管使用什么具体的持久化方案。特别是update语句和insert语句。
其他内容
了解一下git,以及git和svn的对比。请问师兄是推荐学习git还是svn啊?还是两个都要学?
明天计划的事情
任务1-28和1-29,然后强化一下细节,并且看看师兄包括其他人的日报,强化一下一些细节问题。打算1-2天后进入任务二
遇到的问题
- 关于1-25和1-26的考察点有点理解不透,希望师兄能稍微解释一下,谢谢啦
- 再就是关于log4j的level的选择,这个需要多参考其他的例子。
收获
任务1快结束了,所有任务就任务1的子任务最多了,看着就让人头疼。后面的任务不管难度如何,最起码子任务都少,看起来都赏心悦目的。风景都在后面呢,期待。
评论