`

《Java Enterprise 最佳实践》【1】 JDBC最佳实践

阅读更多

Java Enterprise 最佳实践 读书笔记

 

 

JDBC 最佳实践

 

1.   使用PreparedStatement

理由:

(1) 使用pstmt能使得sql代码的可读性更好

(2) 使用pstmt能防止SQL注入,比如其中一个参数带有单引号之类的.

(3) 一般而言,相对于Statement, pstmt的性能要更好,特别是在同一查询会进行多次的时候, 但是需要底层数据库支持这个预编译语句的特性.

         [就其pstmt跟stmt的性能对比而言,在现在的JDBC中,只要不是很多,我认为还是statement的效率会更好.可以参看其他网友的帖子, 我参考了http://onjava.com/pub/a/onjava/excerpt/oraclejdbc_19/index.html?page=1 从这一页最下面的一个小节看起即可]

         补充:

(1)     JDBC,有三类语句,分别是Statement, PreparedStatement, CallableStatement. 首先,在阿里巴巴的笔试题中就出现过选择哪个不是JDBC中的语句类型的题目, 所以这个知识点应该熟悉. 另外就是, 第三个类型的Statement, 是一个基于存储过程的语句. 在实际编程中, 还是应该尽量使用PreparedStatement, 但是对于较复杂的操作, 可以先使用PreparedStatement, 然后分析出性能瓶颈, 再将该部分转换为存储过程, 使用CallableStatement. 另外,存储过程允许DBA处理数据库逻辑, 允许程序员使用所谓的hook钩子函数, 但是千万不能把业务逻辑放到存储过程之中.

(2)     充分使用PreparedStatement

[按照我的理解以及从http://www.ibm.com/developerworks/java/library/j-jdbcnew/ 看到的资料, 我认为要想从pstmt池取pstmt, Connection本身也需要在一个池子里面. 这个实践就有点像使用DBCP或者c3p0这些数据库连接池类库. 在使用他们的时候, 我们只能控制池子的大小而不能控制哪个pstmt返回池中, 取出哪个pstmt].

 

2.   通过数字引用列

ResultSet中获取相应的列有以下两种方式:

(1)     id = rs.getLong(1);

(2)     id = rs.getLong(“personID”);

 

实际上两种方式都不是最好的, 推荐的方式如下:

Static private final int PERSON_ID = 1;

id = rs.getLong(PERSON_ID);

 

3.   Swing应用中对JDBC代码另外建立线程

 [我对于这点没有太大的感受, 原来做的桌面程序都是在windows底下, 使用SWT来进行的. 在使用SWT进行开发的时候,如果需要弹出两个窗口, 就需要注意线程同步的问题了. 这个问题倒是不难解决.]

4.   只使用前向导航的ResultSet

[否则说明你的程序设计或者SQL代码有问题, JAVA不应该负责结果集的随意的移动.]

5.   使用wasNull()检查

If(rs.wasNull()) {

    …//java中没有对应着null的关键字

}

6.   在进行其他优化之前先对SQL进行优化

7.   不要在数据库中保存二进制数据

理由:

这样一来,数据库就会变成一个搬运大块数据的中介

对于这些二进制数据的特殊处理就无法优化

解决方法:

将这些数据放到文件系统之中. 但是这样也带来危害, 及文件可能被删除了,但是数据库中还保存着文件的信息. 不过这种完整性问题并不严重.

8.   不要使用有实际含义的主键

比如email地址,SSN.因为外部世界的变化可能会对系统造成很大的影响,而且自己还无法把握. 最好的实践就是, 用无意义的数字, 比如64位的字符串. 64bit能防止空间耗尽.

 

[这么说来, hibernate中的32位数字字串是最好的方式了?]

 

 

------------------------------------------[本章完]--------------------------------------------------

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics