解决一问题——Oracle中 Char 与 Varchar

给一个现有的项目添加新功能,需要对数据库做更新: 写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的那段代码:

ptmt.setString(2,XXX);

再看数据库里的B对应的那个列的类型,是 Char(12) 查看了下Oracle官方网站里对数据类型的解释:

CHAR(size) Fixed length character data of length size bytes. This should be used for fixed length data. Such as codes A100, B102…

Char型是定长的,在这里DB里的数据都是12位的,长度小于的12的数据被存放到这个域时,oracle会自动用空格补足称12位.

“abc     “和’abc’当然是不相等的 修改sql语句,改为TRIM(B)= ? ,再运行,更新成功。 这个问题虽然不难解决,但是解决问题的方法却也是值得mark下的。

恩,要常动脑筋

遇到这样一个需求:

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++;
}

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

Apache的ab能够查看tomcat运行状态

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

今天又进来一批新员工

08年的新员工今天入司了,我已经成老员工了,看着他们个个脸上新奇的,清澈的目光,唉,去年我也是那样的。 一个人一年时间能改变多少呢?回想过去,在学校呆一年,浑浑噩噩就过去了,在公司呆一年,做了大大的小小几个项目,却学到了不少的东西。 现在后悔当初在学校有大把的时间,大把的资源,不好好用来学习知识,真是莫大的浪费啊。在这工作的一年里,工作之余我投了大把的时间学习框架,以及软件开发理论,还颇有点小的成就感。 当前三大学习目标: VOA ,TDD,Refactor, 2009 ,努力。 昨天晚上,吃完饭赶忙拿起 中午收到的《TDD》看起来,由于这本书的内容相对更理论一点,我的英文水平读起来还是有点吃力,所以抱着本字典边查边看。 女朋友突然来了句”我比你幸福,因为我有个努力的,很有上进心的男朋友,而你没有”,哈哈 甜滋滋的。

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

今天收到《Test-Driven Development》书了。

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