高可用JDBC操作类
最近最一个搜索引擎项目的系统集成模块,数据量比较大,达到千万级。在这个应用中,除了繁杂的系统接口定义,复杂的业务逻辑以及一些诸如投票机制之类的复杂算法之外,还需要编写业务量巨大,性能要求显著的数据库操作接口。目前,系统的model层代码换了3次。
第一次:在项目一开始,由我的一个同事搭建项目,并且初始化了一个他写的数据库操作处理类:http://www.cnblogs.com/sunwubin/p/3187603.html我拿到代码,直接用这个工具类做基础,写了业务逻辑代码。在开始的时候,系统运行的还将就。当数据量达到10万级的时候,出现了一些问题:数据库连接太多,查询问题,继承关系问题。
第二次:针对以上问题,我对这个系统打了一些补丁,使用了c3p0连接池,以及订正了继承关系中整个代码瘫痪的问题。打完上述的补丁,系统现在已经可以撑到100万级的数据操作。在前几日的实际网络情况下,代码运行没有出现过大的问题。
第三次:走到上面的这一步似乎没有什么大的问题了,但是,在我重构代码的时候,发现这个代码写的太恶心了,不成模块,没扩展性,唯有考虑线程共享数据问题等等。于是,我这次推翻以前的所有代码,重新做了一个jdbc的基础操作类库。实现的依赖于spring的jdbc工具类。以及使用了c3p0做数据库连接池。为什么要依赖于spring-jdbc呢?
1、 轻量级(使用spring-jdbc仅需要额外实例化2个类)
2、 免去对象实例化的繁琐操作。
写到这里,突然想到一个很好笑的事情,身边有些哥们儿,很排斥用框架,觉得自己写的代码牛逼,觉得自己写的代码安全。其实呢,在我看来,这些个人,纯粹吊丝了,
第一, 要写框架,大多要用大反射,那么首先你觉得你写的反射的工具类有commons-beanutils这个包的代码写的好吗?写不到这么好就别瞎闹。只知道用Class,Method就当自己把反射玩得转了,那叫乳臭未干。java.beans.*;这个包下面的东西没学好,就别在哪里扯自己可以写框架
第二, 做的项目乱new,乱final,没有接口,没有抽象类的,基本上你连对象管理都没打理好,更别说什么高内聚,低耦合了。
第三, 还有就是那些整天吼着天南海北,动不动大数据,动不动高性能的,那简直他妈的就胡扯。代码都写不好,还谈什么优化。孰不知写不好代码,就如小孩还不能完整清晰的认识世界。何谈治国何谈兴家。
说了一大堆,还是贴几句自己写的代码吧:下面给一个通用的系统数据操作方案。
一般来说,须具备一下功能:
1、 Crud(增删改查)
2、 分页
3、 自定义异常处理
4、 高复用性
首先贴一个使用的代码:
1 public inte易做图ce BookDao extends BaseDao<Book, Integer>{
2 boolean isExit(String isbn);
3 Book getBookByISBN(String isbn);
4 }
5
6 @Repository("bookDao")
7 class BookDaoImpl extends BaseDaoMysqlImpl<Book, Integer> implements BookDao{
8 BookDaoImpl(){
9 super(Book.class);
10 }
11
12 @Override
13 public boolean isExit(String isbn) {
14 List<String> keys = new ArrayList<String>();
15 List<Object> values = new ArrayList<Object>();
16 keys.add("ISBN");
17 values.add(isbn);
18 return this.isExit(keys, values);
19 }
20
21 @Override
22 public Book getBookByISBN(String isbn) {
23 Map<String,Object> map = new HashMap<String,Object>();
24 map.put("ISBN", isbn);
25 return this.searchOne(map);
26 }
27 }
View Code
然后是一个基础类的接口代码:
1 package com.bimoku.persistence.dao;
2
3 import java.io.Serializable;
4 import java.util.List;
5 import java.util.Map;
6
7 import com.bimoku.persistence.bean.PageBean;
8
9
10 /**
11 * 基础数据操作接口
12 * 包含:
13 * 批量增删改查
14 * 获取单一类型(int,long)类型的值
15 * 基本数据查询
16 * @date 2013-8-20
17 * @version v0.1.2[last version]
18 * @author LPM
19 * @param <T>
20 * @param <ID>
21 */
22 public inte易做图ce BaseDao<T,ID extends Serializable> {
23
24 //*******************************
25 //jdbc implements with jdbcsupport
26 //*******************************
27
28 /**
29 * 基础接口之一</br>
30 * 批量添加接口
31 * @param sql
32 * @param values
33 * @return
34 */
35 public int[] batchAdd(String sql, List<List<Object>> values);
36
37 /**
38 * 基础接口之一</br>
39 * 批量删除记录接口
40 * @param sql
41 * @param values
42 * @return
43 */
44 public int del(String sql, List<Object> values);
45
46 /**
47 * 基础接口之一</br>
48 * 更新接口
49 * @param sql
50 * @param values
51 * @return
52 */
53 public int update(String sql, List<Object> values);
54
55 /**
56 * 基础接口之一</br>
57 * 查询一个long值
58 * @param sql
59 * @param values
60 * @return
61 */
62 public long getLong(String sql, List<Object> values);
63
64 /**
65 * 基础接口之一</br>
66 * 查询一个int值
67 * @param sql
68 * @param values
69 * @return
70 */
71 public int getInt(String sql, List<Object> values);
72
73 /**
74 * 基础接口之一</br>
75  
补充:综合编程 , 其他综合 ,