客户网站流量的提高,导致几次系统内存崩溃,察看日志发现,是DAO层对数据库过量请求引起的,居然发现一个SQL中,使用了13个jion,被雷到了。
而今天一个同事为另外一个项目的增添新功能,明明只需要一个表内的数据,却对数据库请求了5次,其中三次是彻底的无用功,一次仅仅为了验证数据的存在,而是用join并把一个表中的所有字段拿出,无语了。
我们的几个项目都是一种构架,WebService分为了两层:DAO通过POJO负责与数据库交互,Service层,通过DTO与客户端通信,而POJO也负责DAO和Service之间的数据传递。而DAO在第一个项目开始不久,就放弃了Hibernate,完全适用JDBC对数据库进行访问。
POJO基本上是与数据库中的每个表对应,所有的字段都有相应的属性映射。而DTO为了提高网络传递的效率,只有客户端需要的属性,因此有几个DTO对应一个POJO的情况存在,同时在DAO和Service层分别由Assembler负责相应对象的创建和属性的赋值。
而上述情况就是由于开发过程中,为了减少Assembler的数量和代码的重复造成的。
其实这种情况可以通过以下方案解决:
1、DAO方法调用该方法的Service接口需要提供的数据,确定表及字段。
2、POJO中的属性名称与表格的字段名称一一对应,并保持一致。
3、在DAO层的Assembler中,对POJO所有属性通过Field动态赋值,并捕捉SQL异常。
4、通过JUnit保证DTO提供了客户端所需的所有属性是争取的。
希望下一个项目中,开始使用这个机制。