MyException - 我的异常网
当前位置:我的异常网» J2SE » 几道小小的题目一起和大家更进一步地了解 Java (Ⅳ

几道小小的题目一起和大家更进一步地了解 Java (Ⅳ)解决办法(2)

www.MyException.Cn  网友分享于:2013-12-29  浏览:28次


但在 TeacherDao 中,也要会有这几个方法,只是传入的参数不同而已。如果在每个 DAO 里都写上
这么几个方法就显示很拖杳,重复的代码就会很多。

以大家常用的 Spring + Hibernate 组合来说,Spring 提供了一个操作 Hibernate 的抽象类
——HiernateDaoSupport,只要继承它就可以很方便地实现一些 DAO 操作,通常采用 Hibernate
实现类的签名为:

Java code
public StudentHibernateDao extends HibernateSupportDao implements StudentDao;

                                           +-------------------------------+
                       class of Spring --> |          <<abstract>>         |
                                           |       HibernateDaoSupport     |
                                           +-------------------------------+
                                                           A
                                      |                    |
<------ DAO Interface Package ------->|<- Hibernate Impleme|ntation Package ->
                                      |                    |
+-------------------------------+     |    +-------------------------------+
|         <<interface>>         |     |    |                               |
|           StudentDao          |     |    |      StudentHibernateDao      |
+-------------------------------+     |    +-------------------------------+
| + get(Serializable) : Student |     |    | + get(Serializable) : Student |
| + getAll() : List<Student>    |<- - - - -| + getAll() : List<Student>    |
| + save(Student) : void        |     |    | + save(Student) : void        |
| + remove(Student) : void      |     |    | + remove(Student) : void      |
| + update(Student) : void      |     |    | + update(Student) : void      |
| + method1()                   |     |    | + method1()                   |
| + method2()                   |     |    | + method2()                   |
| + ...                         |     |    | + ...                         |
+-------------------------------+     |    +-------------------------------+
                                      |

<- - - - 表示实现接口(不表示依赖哦,因为在半角状态下我找了好久都没找到向左的空心三角啦,
                      将究着看看,不要要求太高哈)

A
|        表示继承(就把 A 的两个脚去掉,看成向上的空心三角哈)
|


这样我们只要在客户端配置一下具体的实现类,采用 StudentDao 进行面向接口的编程就可以完成
DAO 操作了,从而大大降低了耦合程度。

但是这样做,HibernateSupportDao 中并没有提供那几个基本的 CRUD 操作,在这种情况下这个
类的签名并不能满足我们的要求,需要重新进行设计(仍然需要 HibernateSupportDao 提供的功
能),不改变客户端的行为(与普通的实现采用同样的配置、同样的调用),在实现时不需要每个
DAO 里重复劳动地去写那几个方法,以降低 DAO 层的工作量。你该如何进行设计?

当然了,这里仅仅只是举一个以 Spring + Hibernate 为代表的例子,这样的设计也可以用于其
他方面。

=====★===我===是===题===目===间===的===小===分===隔===符===★=====

6,如何关闭?

我们都使用过数据库连接池,即在连接池中保存了多个数据库连接 Connection 对象,需要连接数
据库时从池中取出一个 Connection 对象进行操作,用完后将这个对象归还到池中。一般来说连接
池采用一个集合来存放这些连接对象,在调用 getConnection 方法时从集合中取中一个,用完后
采用 con.close() 把这个连接归还到池中。

嘿嘿,现在问题来了,我们都知道 con.close() 是关闭与数据库之间的连接,但是在连接池的状态
下我们并不能真正地将其关闭掉(如果真的关掉的话,这个连接就不能再重用了)。现在有个办法,
就是不调用 con.close(),同样地也就不让连接关闭,在使用完后用 releaseConnection(Connection con) 
的方法将其归还到池中。但是这样做问题又来了,Connection 中的 close() 方法是公开的,我们
并不能阻止使用者调用它。现在我们要设计这个连接池,不采用 releaseConnection 的方法,我们
要改变原有 con.close() 中的行为,不让其关闭,而是把它归还到池中。

当然了,这只是连接池中一个很小的问题,要设计一个功能完善的连接池,至少还需要连接参数的可配
置化、连接异常的检测和处理等,而且问题远不止这些,问题可能会多得超出我所能想到的 :(

这里并不是需要大家去实现一个连接池,只是提出一个小问题,拓展一下思路,发表一下您对这个问题
的看法,或者是您将会怎么做?解决这个问题的话,我们就可以自己实现一个很很简单的连接池哦 :)

注意:Connection 仅仅是个接口

曾经看过一些网友实现的连接池,基本上都是采用 releaseConnection 的形式来将连接归还到池中去
的,并没有解决 con.close() 的问题,使用者的行为我们是无法加以干涉的,如果使用者不习惯去调用
releaseConnection,而是照常用的习惯去调用 con.close() 的话,这个连接池就是形同虚设,因为这
样一个连接都得不到重用。

=======================================================

PS-1:帖子的字数比较多,感谢大家耐心地把它看完。(羞羞羞,某种果子怎么不说自己表达能力差,尽是废话呢?)
PS-2:如有描述不清之处,请在回复中指出,我会负责说明和解释的。(嘿嘿,某种果子承认自己表达能力差了吧!)
PS-3:这次大多数都是动手题,为了回报大家的付出我会再加 100 分的。(果子也没加过分,果子好像在哪里看到过最多只能加 100 分的,到时再说吧,果子能多加就多加)

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有