以下摘自深入浅出hibernate:
DAO模式中,数据库访问层实现被隐藏到Data Accessor中,前面说过,DAO模式实际上是两个模式的组合,即Data Accessor和domain Object模式。
何谓Data Accessor?即将数据访问的实现机制加以封装,于数据的使用代码想分离,从外部来看,Data Accessor提供了黑盒式的数据存取接口。
Domain Object则提供了对所面向领域内对象的封装。
从某种意义上,我们可以这么理解:
Data Accessor Object(DAO)=Data + Accessor + domain Object
开闭原则:对扩展开放,对修改封闭
数据库连接不仅仅是在应用服务器与数据库服务器之间建立一个Socket Connection(对于Type 4的jdbc Driver而言),连接建立之后,应用服务器和数据库服务器之间还需要交换若干次数据(验证用户密码,权限等),然后,数据库开始初始化连接会话句柄,记录联机日志,为此连接分配相应的处理进程和系统资源。系统如此忙碌,如果我们只是简单地扔过去两个SQL语句,然后就将此连接抛弃实在可惜,而数据库连接池技术正是为了解决这个问题。
一个完备的数据库连接池实现应该具备更加全面的管理机制,如对连接池更加高效的管理,相关参数的可配置化实现,池中连接的异常状态检测和处理等(如某些数据库会对当前连接进行检测,如果发现有长时间未用连接则主动将其断开,如果出现这样的情况将导致后继数据库访问异常。)
hibernate 3 中对包名进行了修改,net.sf.hibernate=>org.hibernate
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
configuration 实例会根据当前的数据库配置信息,构造SessionFactory实例并返回。SessionFactory 一旦构造完毕,即被赋予特定的配置信息。
也就是说,之后config的任何变更将不会 影响到已经创建的SessionFactory实例。如果需要使用基于改动后的config实例的SessionFactory,需要从config重新构建一个SessionFactory实例。同样,如果应用中需要访问多个数据库,那么针对每个数据库,应分别为其创建对应的SessionFactory实例。
SessionFactory中保存了对应当前数据库 配置的所有映射关系,同时也负责维护当前的二级缓存和StatementPool。由此可见,SessionFactory的创建过程必然非常复杂,代价高昂,而这也意味着,我们应该在系统设计中充分考虑到SessionFactory的重用策略。由于SessionFactory采取了线程安全的设计,可由多个线程并发调用,大多数情况下,一个应用中针对一个数据库共享一个SessionFactory实例即可。