现在的位置: 首页 > 综合 > 正文

jforum学习–jforum的数据库存取机制设计

2013年10月11日 ⁄ 综合 ⁄ 共 1569字 ⁄ 字号 评论关闭

当论坛启动时,JForum类的init方法被执行,该方法调用了ForumStartup.startDatabase();
startDatabase()源代码:
public static boolean startDatabase()
{
    try {
        if (DBConnection.createInstance()) {
            //配置好数据库连接池
            DBConnection.getImplementation().init();
               
            // Check if we're in fact up and running
            Connection conn = DBConnection.getImplementation().getConnection();//从连接池获取连接
            DBConnection.getImplementation().releaseConnection(conn);//从连接池释放连接
        }
    }
    catch (Exception e) {
        throw new DatabaseException("Error while trying to start the database: " + e, e);
    }
       
    return true;
}
该方法配置了系统的数据库连接池

抽象类DBConnection的createInstance()方法通过net.jforum.PooledConnection创建了DBConnection对象的实例,这个实例将赋给DBConnection中声明的一个DBConnection类型的变量,即这个变量实际上是PooledConnection类型的,PooledConnection继承了C3P0PooledConnection,而C3P0PooledConnection又继承了DBConnection。C3P0PooledConnection在实现DBConnection的init()方法时,配置了连接池的各个参数,到此,连接池便可以使用了。在DAO实现中,可以方便的通过DBConnection类从连接池中获取连接。实际上,DAO实现中,并不是直接通过DBConnection类获取连接,而是通过论坛执行环境类JForumExecutionContext的getConnection()方法获取连接,取得连接后就可以常规的访问数据库。

当客户端请求送达JForum的service方法后,系统自动识别并找到对应的action,并执行其方法,通过repository包中的各个类来获取所需信息,repository包中的类(不是全部,有的自己定义了缓存)实现了Cacheable接口,该接口只有一个方法,用于设置各个仓库类的默认缓存引擎
Cacheable接口方法声明:public void setCacheEngine(CacheEngine engine);
CacheEngine是系统的缓存引擎接口,各个仓库类设置了它的实现类DefaultCacheEngine为各自的缓存引擎,各仓库类将数据保存在缓存中,方便系统的存取。因此,这些仓库类才是真正调用DAO的地方。
在获取DAO的设计上,jforum提供了一个抽象类DataAccessDriver,包含有获取全部DAO的get方法,它的实现类GenericDataAccessDriver做了一般的get方法实现,只需要通过DataAccessDriver.getInstance().new***DAO()便可以获取DAO,针对不同的数据库,比如SQL SERVER,MYSQL等都有继承自GenericDataAccessDriver的子类

抱歉!评论已关闭.