给一个现有的项目添加新功能,需要对数据库做更新:写SQL语句,创建PreparedStatementd对象,绑定参数,执行statement,提交事务,很简单的一件事。然而这里问题出现了,log里生成的SQL语句看起来异常地正确,但是却不能对数据库里的数据更新,JUnit运行失败。这个项目的框架构建者对PreparedStatement自己再做了层封装,实现了一个logable的PreparedStatement,所以日志里的sql都是和参数绑定好的,拿来在SQLDeveloper里运行,很完美,数据被更新了,得到了预想的结果。怎么会这样?挠头中……

         分析原因:SQL不正确?没有提交事务?仔细检查下代码,两个假设很快就被否定了。想什么招呢?从更新条件下手,总共有三个更新条件(where A= ? and B=? and  C=?)先把要更新的数据库表里的数据备份,然后修改SQL语句的更新条件成(where A = ?),运行JUnit,更新成功!然后慢慢增加更新条件,最终将问题锁定在条件B,只要加上条件B,JUnit就失败了,再看绑定B的那段代码:

  stmt.setString(2, XXX); 

再看数据库里的B对应的那个列的类型,是 Char(12)

查看了下Oracle官方网站里对数据类型的解释:

<table border="1" width="100%" style="font-family: Helvetica, Arial, Verdana, geneva, sans-serif; font-weight: normal; font-size: 100%" bordercolor="#A6A6A6"><tbody><tr style="font-family: verdana, geneva, helvetica, sans-serif; font-weight: normal; font-size: 100%"><td width="17%" style="font-family: verdana, geneva, helvetica, sans-serif; font-weight: normal; font-size: small">CHAR(size)</td><td width="18%" style="font-family: verdana, geneva, helvetica, sans-serif; font-weight: normal; font-size: small">Fixed length character data of length size bytes. This should be used for fixed length data. Such as codes A100, B102…</td></tr></tbody></table><p> </p><p>Char型是定长的,在这里DB里的数据都是12位的,长度小于的12的数据被存放到这个域时,oracle会自动用空格补足称12位。‘abc         ’和’abc’当然是不相等的。 </p><p>修改sql语句,改为“TRIM(B)= ?” ,再运行,更新成功。</p><p>这个问题虽然不难解决,但是解决问题的方法却也是值得mark下的。 </p><p> </p>

遇到这样一个需求:

     A = 1时,B=1

     A=2时:
     C(一个小时内的一个时间点)在00~29之间时、B=1。
     C在30~59之间时、B=2

     A=3时:
     C在00~19之间时、B=1。
     C在20~39之间时、B=2。
     C在40~59之间时、B=3。
     A=4时:
     C在00~14之间时、B=1。
     C在15~29之间时、B=2。
     C在30~44之间时、B=3。
     C在45~59之间时、B=4。

看起来一个稍复杂的需求,难道用"if else" 或者“switch”?我周围真有人这么干的。

再仔细观察下,用如下程序可以解决:

     int B= (C+1)/(60/A);
       
        if((C+1)%(60/A) > 0){

               //对B取上界

                B++; 
        }

小聪明而已,写下这个只是想提醒下自己,在编程时 “要用最少的代码最好地完成最多的事”

在javaeye上看到个讨论事务的帖子,帖子中提到了通过查看 tomcat线程数来判断事务设置是否合理,于是回帖问了下如何查看tomcat运行状态,楼主回帖说用 apache的 ab,现在还没时间,抽空了解一下

08年的新员工今天入司了,我已经成老员工了,看着他们个个脸上新奇的,清澈的目光,唉,去年我也是那样的。

一个人一年时间能改变多少呢?回想过去,在学校呆一年,浑浑噩噩就过去了,在公司呆一年,做了大大的小小几个项目,却学到了不少的东西。现在后悔当初在学校有大把的时间,大把的资源,不好好用来学习知识,真是莫大的浪费啊。在这工作的一年里,工作之余我投了大把的时间学习框架,以及软件开发理论,还颇有点小的成就感。

当前三大学习目标: VOA ,TDD,Refactor, 2009 ,努力。

 

昨天晚上,吃完饭赶忙拿起 中午收到的《TDD》看起来,由于这本书的内容相对更理论一点,我的英文水平读起来还是有点吃力,所以抱着本字典边查边看。女朋友突然来了句“我比你幸福,因为我有个努力的,很有上进心的男朋友,而你没有”,哈哈 甜滋滋的。

 PS:作为一个一年经验的员工,当然没有机会去带别人做东西,真得希望能够在这批新员工里发现一个能够与之探讨技术的人,能够与我探讨重构,测试驱动开发,以及各个框架底层的东西,知识就是在不断的交流中才能发觉更多。

 

上周在当当上订的《测试驱动开发》影印版,这周一就收到了,速度啊。前阵子在项目里试着做了点TDD,现在再拿这本获得Software Development Productivity大奖的TDD入门经典把知识再巩固一下子,在后面的学习过程中的心得也会逐一写到这里。