`
jinjiankang
  • 浏览: 113419 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JForum源代码研究—数据库连接池

阅读更多

JForum是如何实现多种数据库连接/连接池方法的?

 

建立数据库连接的简单方法示意如下:

Connection conn = DriverManager.getConnection(url);

 

JForum支持单连接和多种连接池实现,每种连接实现都要继承DBConnection。包括:C3P0PooledConnect、DataSourceConnection、SimpleConnection(PooledConnection空继承了C3P0PooledConnect)。

public abstract class DBConnection 
{
    ...
    public abstract void init() throws Exception;
    public abstract Connection getConnection();
    public abstract void releaseConnection(Connection conn);
    public abstract void realReleaseAllConnections() throws Exception;
    ...
}

 

init()方法仅在系统启动时调用一次。C3P0PooledConnect的init()方法用于:

  • 新建ComboPooledDataSource对象
  • 设置驱动器类
  • 设置URL
  • 设置最小、最大池大小
  • 等其他设置

DataSourceConnection的init()方法用于:初始化javax.sql.DataSource对象。

SimpleConnection的的init()方法用于:建立单个连接,并销毁该连接。其实,目的是检验能否建立连接。例如:初始安装JForum时,可用于检验数据库配置是否正确。不会用于DAO操作。

 

C3P0PooledConnect的getConnection()方法用于:ComboPooledDataSource.getConnection()。

DataSourceConnection的getConnection()方法用于:DataSource.getConnection()。

SimpleConnection的getConnection()方法用于:DriverManager.getConnection(url)。

 

对于releaseConnection(Connection),三个类的实现都一样:Connection.close()。

 

对于realReleaseAllConnections(),C3P0PooledConnect的实现是com.mchange.v2.c3p0.DataSources.destroy(this.ds)。其他两个类都是空实现。

 

新建数据库连接对象时,不具体声明某种具体的连接,如:C3P0PooledConnect conn = ...,而是使用DBConnection conn = DBConnection.createInstance()和getImplementation()。createInstance()通过Class.forName()新建一个配置的连接实现类。

 

...
private static DBConnection instance;	

public static boolean createInstance()
	{
		try {
			instance = (DBConnection)Class.forName(SystemGlobals.getValue(
					ConfigKeys.DATABASE_CONNECTION_IMPLEMENTATION)).newInstance();
		}
		catch (Exception e) {
			 logger.warn("Error creating the database connection implementation instance. " + e);
			 e.printStackTrace();
			 return false;
		}
		
		return true;
	}
 

 

如果我们在自己的项目中要实现多种数据库连接/连接池,可以借鉴JForum的做法。但是有一点,如果想要使用其它的连接池实现,如DBCP,JForum支持吗?应该是不支持的。除非我们自己新建一个类DBCPConnection,并继承DBConnection。

 

后记:试图想深学习一点JForum的做法,但感觉上文全是废话。请看官多留言交流。

分享到:
评论

相关推荐

    jforum3源代码 数据库

    **JForum3源代码数据库详解** JForum3是一款基于Java的开源论坛系统,它提供了丰富的社区功能,包括用户管理、论坛板块、主题讨论、帖子回复等。本篇将深入探讨JForum3的源代码和其与数据库的交互,以及如何进行...

    java开源包101

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包8

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包10

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包4

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包1

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包11

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包2

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包3

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包6

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包5

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包7

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包9

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    Java资源包01

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

Global site tag (gtag.js) - Google Analytics