项目总结(Ajax+Struts+Spring+Hiberante+SQLServer2000) 第三部分

来源:互联网 发布:热水器 类型 知乎 编辑:程序博客网 时间:2024/04/25 21:19

因为本次项目是政府项目,所以数据库服务器采用SQLServer2000,我真是抗议了好长时间呀,让Java和微软的产品协同工作真是太令人发狂,SQLServer2000也不令人失望,总是搞出点问题来阻挠项目进度。

1. 项目中持久层采用Hibernate,本希望能通过Hibernate这种好称可以在任何主流数据库上移植代码的东东摆平SQLServer。配置文件都 写在applicationContext 中,是为了Spring来控制Hiberante的事务,大体上配置并没有出什么问题。

但是 SQLServer2000毕竟是有点落伍的产品,当时支撑的服务器是WindowsServer2003,死活的无法打开连接,好在一同事曾经用过,当 时在企业管理器上做了一些修改才得以远程连接控制SQLSERVER,但是此同事3天后就离职,至今不知道他当时做了些什么,好在后来这个问题没有再发生 (如果再发生后果不堪设想……)。

具体的解决方法好像是创建一个新的用户给项目使用,并且设定相应可控制的数据表和权限,这些都是微软的那种傻瓜式配置,有一份用户手册就足以应付。

2.接下来我在做连接测试的时候又发现 无法打开连接,一直抛一个错误,具体错误已经记不大清楚了,后来在网上查到在Windows Server2003上使用SQLServer2000必须将其升级为SP4以上版本,否则无法打开1433端口,升级结束,果然好用了。

3.在项目开发的过程中发现微软提供的JDBC驱动居然不能支持一些关联查询,好像还有其他的问题,结果中途被迫更换使用第三方驱动jtds,再次强化我反微软的决心!

4. 由于SQLServer没有采用标准的SQL语法,而是自己的一套TransactionSQL,也为数据库维护带来极大不便,起初根本无法进行创建表操 作。后来老大求助一位强人,他带来了PowerDesign,在其中进行了表结构设计,令人惊奇的发现PowerDesign可以生成 SqlScript,而且还可以按照不同的数据库生成不同的SQL(当时第一次见到PD这个牛X的工具,难免有点土包子),让很多复杂的表结构和烦人的 SQL语句问题都迎刃而解,开心ing

5.在习惯了使用PD以后,就很少自己去写SQL,顶多自己写写Select之类的东西,大任务都是 用PD或者查询企业管理器,因为后来还出现了对存储过程和任务调度的需求,远远超出我这个数据库菜鸟的能力范围。PD虽然使用很方便,还提供表结构和持久 化对象的转换,但是在进行数据表设计时还是要小心,不能那么为所欲为的使用表关联,有很多关联看上去很有用,觉得写上去是很合乎业务逻辑,但是到了业务实 现的时候就发现那些关联不是那么好操纵的,所以在设计表结构的时候一定要想清楚很多复杂关联能否简化,项目组成员是否具备解决这么复杂处理的问题,如果到 项目开发中期才发现这个问题,那结果就会跟我一样…… 我当时对Hibernate处理映射相当不熟练,结果无奈之下将表的结构进行了重新设计和简化,工作量是可想而知的,呜……

6.今天在网上 和网友聊天的时候他出现一个问题,有关Hiberante使用查询select * from table的问题,以前刚玩Hibernate的时候不懂,只知道Hibernate是按照对象进行映射的,所以被迷惑着,以为Hibernate取出来 的东西必定是按照对象映射关系。今天在帮他解决这个问题的时候突然想到,如果是那样的话,为什么使用select distinct(*)为什么会返回一个包含字串的对象数组呢? 于是做了一个简单的测试,跟跟断点,发现在使用select id form table 这种命令的时候,Hibernate是将结果返回对象数组并存放在list中返回,难怪以前使用其映射对象cast的时候老是报错,这回这个问题终于想通 了,以后又可以节省一些代码,估计也能提高一点效率吧 :P。这个问题关键是走出一个误区,我估计很多人都是有那个错误的想法,至少我身边的同事和一些网友都是这么认为,结果遇到 ClassCastException的时候摸不到头脑。也许看看源码一下子就解决的问题结果被困扰很久甚至走弯路,看来我们需要养成阅读源码寻找问题根 源的习惯。

7.上周在项目中和同事研究一个分页的问题,当时项目紧,我手头没有相关资料,于是自己写了个分页的东东,庆幸在使用中没有太大 的问题。其中分页的思路是封装一个包含页信息的对象传到Dao层,然后使用QBC进行检索再返回结果。其中有一个处理就是必须获得查询结果的总条数,当时 没有时间去考虑方法,后来也没能想到解决办法,就直接使用criteria.list().size()直接将结果先全部查询一遍,直到项目交工的时候还 用TODO注解为Bad performance。我同事说这个解决办法性能低的要死哦,我只能无奈的摊摊手。但是新项目数据量可没那么温柔,如果还使用这个分页可就麻烦大了,怎 么办?为了一个总页数重新写方法? 因为书上说只有HQL才支持聚集函数。后来得到网友的帮助,才得以解决,方法是在查询总数的时候增加一个设定:

criteria.setProjections(Projections.count().uniqueResult());  然后在criteria.list(),打印SQL语句果然执行了select count(*),不知道性能提高多少个百分点,爽!

这 里面要注意两个地方,一是使用了uniqueResult(),因为select count(*) 明显是一条结果,那么使用uniqueResult()也是一种简化代码和提高效率的方法。二是由于criteria被更改,接下来的分页查询就无法正确 进行了,所以需要在分页查询之前增加一段代码 criteria.setProjections(null) ,将其置空,查询正常进行。

 
原创粉丝点击