使用ConnectionManager适应多数据库的应用环境

connection|数据|数据库

原文:

 今天企业应用环境中一般情况下要面对不止一个或一类数据库;另一方面不同时期的不同种类的数据库形成一个个的荒岛;在java中,技术潮流倾向于不是直接操作数据库记录,而是通过中间层的数据库对象持久化处理达到OO的目的。无论那一种,都要求比较容易地面对多个数据库连接。多个数据库连接比较为人所熟悉的是微软的ODBC数据源设置,除了没有实现中间层持久化外,ODBC其实比JDBC要全面也更容易处理。ConnectionManager是一个通过 XML设置的,类似于ODBC数据源设置的东西,通过定义dao.Connection对象,程序可以按需要以:java.sql.Connection conn   =ConnectionManager.getConnection(${connectionname});得到所需要的连接,从而简化了在多个数据库环境下的编辑工作。

    现在项目开发者面临的常常是多个数据库的应用,历史的和不同部门的,有CS后台的也有BS前台的。各个数据库的数据必须融汇到同一个业务逻辑中,否则就成为一个个低价值的数据孤岛。应对这种需求,目前使用了两种技术,一是数据对象化技术,实质就是在数据层和应用逻辑层中间插入一个持久对象化层,通过程序或容器使数据对象与数据记录相一致,而应用逻辑直接访问数据对象而不是数据库记录;二是通过使用全局目录调动使用多个数据库供数据对象化管理层使用。无论是 EJB ENTITy,还是Hibernate,抑或是我处已写的Hanva Processor都是这种思路的一种体现。

    并不总是需要采用EJB才能管理多个数据源,何况大部分项目中采用EJB带的是更高的成本和性能的更低效,开发工作更复杂化,甚至只是碰运气地填代码再发布不行再填代码再碰运气,(我本人很讨厌这种开发感觉,所以搞了一个Hanva的小项目,除非客户指定EJB了)。不过EJB容器中管理多个数据源的方式还是很值得学习的。大部分情况下,它是通过初始化后的数据源对象,象连接池,注册进JNDI SPI;然后通过java.naming.Context.lookup()这个全局名称(在JVM范围内)。我的做法是由写一个 ConnectionManager,它由一个xml文件定义多个数据库连接相关的参数,在ConnectionManager初始化时读入内存。使用时然后通过调用ConnectionManager的静态方法getConnection (String connectionname),就可以得到指定数据库连接。由于实际上操作数据库连接的都是Processor和Lister两个类,这样,要保证连接资源的释放也是很有把握的。依靠这个方法,就可以在轻型的应用中都可以搞妥多数据库,使用数据对象化方式进行开发了。

connections.xml定义:

<connection-set><description><![CDATA[ connection-set供ConnectionManager使用,可以按需要取用不定的多个连接定义,代码完全不变。从而适应多数据库的使用环境;]]></description> <connection name="GlobalPool" driver="datasource" uri="java:comp/env/globalpool" /> <connection name="MysqlPool" driver="datasource" uri="java:comp/env/mysqlpool" /> <connection name="mysql" driver="com.mysql.jdbc.Driver" username="michelle" password="favordog">  <uri><![CDATA[jdbc:mysql://127.0.0.1:3306/dkt?useUnicode=true&characterEncoding=gb2312]]></uri> </connection>  <connection name="conn" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="dcon" password="girlfriend" /> <connection name="reso" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="erso" password="abc" /> <connection name="daifu" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="eef" password="qwewer" /> <connection name="system" driver="oracle.jdbc.driver.OracleDriver"   uri="jdbc:oracle:thin:@127.0.0.1:1521:dkt0" username="system" password="manager" /></connection-set>

ConnectionManager方法:

public class ConnectionManager{  private static LOGGER logger =(LOGGER)Loger.getLogger(Constants.LOGGER_DAIFU_KEY);

public static synchronized java.sql.Connection getConnection() throws java.sql.SQLException{ String name =Repository.getInstance().getConn(); return getConnection(name); }

public static synchronized java.sql.Connection getConnection(String name) throws java.sql.SQLException{ if(Repository.getInstance()==null){  logger.error("the repository for dao operation has not been initialized");  return null;  } dao.Connection conn =Repository.getInstance().getConnection(name); String dri =conn.getDriver(); java.sql.Connection cn =null; try{  if(dri.equalsIgnoreCase("datasource")){   javax.naming.Context initCtx = new javax.naming.InitialContext();   javax.sql.DataSource ds = (javax.sql.DataSource)initCtx.lookup(conn.getUri());          cn        = ds.getConnection();   }   else{   Class.forName(dri);//no newInstance();only get class                 cn = java.sql.DriverManager.getConnection(conn.getUri(),conn.getUsername(),conn.getPassword());   }   }catch(Exception ex){  String msg ="ConnectionManager.class,conname:="+name+";dri:="+dri+";cn:="+cn+";msg:="+ex.getMessage();  logger.error(msg,ConnectionManager.class);  throw new java.sql.SQLException(msg);  } return cn; } public static synchronized java.sql.Connection getConnection(dao.Connection conn) throws java.sql.SQLException{ if(conn==null){  System.out.println("the dao.Connection to getConnection is null;");  return null;  } String dri =conn.getDriver(); java.sql.Connection cn =null; try{  if(dri.equalsIgnoreCase("datasource")){   javax.naming.Context initCtx = new javax.naming.InitialContext();   javax.sql.DataSource ds = (javax.sql.DataSource)initCtx.lookup(conn.getUri());          cn        = ds.getConnection();   }   else{   Class.forName(dri);//no newInstance();only get class                 cn = java.sql.DriverManager.getConnection(conn.getUri(),conn.getUsername(),conn.getPassword());   }   }catch(Exception ex){  String msg ="dri:="+dri+";cn:="+cn+";msg:="+ex.getMessage();  logger.error(msg,ConnectionManager.class);  throw new java.sql.SQLException(msg);  } return cn; }  public static void main(String[] args) throws Exception{ if(args==null || args.length<2){   System.out.println(" Please input the xml and conn's name");  return;  } Repository.parse(args[0]);  java.sql.Connection conn =getConnection(args[1]); System.out.println(conn); }

}

调用时只需要

java.sql.Connection conn =ConnectionManager.getConnection("connn");

就可以得到指定方式的数据库连接。

时间: 2025-01-31 05:39:16

使用ConnectionManager适应多数据库的应用环境的相关文章

Fusion-io携手戴尔向全球客户交付全闪存

 Fusion-io日前宣布其全闪存产品ION Accelerator将与戴尔充分整合,并作为戴尔品牌下的解决方案推向市场.沿袭了Fusion-io闪存一流的性能及可靠性,戴尔数据库加速解决方案易于部署,专为类似Oracle.SAP HANA与Microsoft SQL Server等企业应用及虚拟化工作负载实现加速.这款全闪存解决方案以应用为中心加速数据密集型工作负载,从而让一般用途的存储系统能够专注于数据容量管理. Fusion-io执行副总裁兼首席战略与产品官Gary Smerdon表示:

基于XML的数据库总体分析

xml|数据|数据库     我们知道当存在大量数据需要处理分析的话,最好是把这些数据放到数据库中,所以几乎所有大型的商业应用系统都是和数据库相关联的,所以如果XML需要在商业领域大展宏图的话,也必须要和数据库相联系.所以这里首先需要讨论的一点问题是,XML本身是不是数据库,从严格的意义上来说,XML仅仅意味着XML文档.因为尽管一个XML文档包含数据,但是如果不通过其他的软件的软件来进行数据处理的话,它本身只不过是一个文本文件.所以XML本身不不能和数据库挂上钩,但是加上一些其他的辅助工具,我

[转]Apache+PHP3+PostgreSQL作为基于Web的数据库平台的安装

apache|web|数据|数据库 发信人: xiaoning (我要飞), 信区: Linux 标  题: Apache+PHP3+PostgreSQL作为基于Web的数据库平台的安 发信站: BBS 水木清华站 (Thu Jan 20 16:00:28 2000)   以下将说明使用Apache+PHP3+PostgreSQL作为基于Web的数据库平台的安装和配置方法 . 关于Apache.PHP3和PostgreSQL的更多内容可以从软件的附带文档.Linux的HOWTO文件   以及以下

数据库设计方法、规范与技巧

规范|技巧|设计|数据|数据库|数据库设计 数据库设计方法.规范与技巧(推荐)   一.数据库设计过程数据库技术是信息资源管理最有效的手段.数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求.数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求),在概念设计阶段形成独立于机器特点.独立于各个DBMS产品的概念模式(信息世界模型),用E-R图来描述.在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系

漫谈.Net PetShop和Duwamish ADO.NET数据库编程

ado|编程|数据|数据库 概述 ADO.NET为我们提供了强大的数据库开发能力,它内置的多个对象为我们的数据库编程提供了不同的选择.但是在允许我们灵活选用的同时,许多初学者也很迷惑,我到底是应该使用DataReader还是应该使用DataAdapter?我只想读取一小部分数据,难道我一定要Fill满整个DataSet吗?为什么DataReader不能和RecordSet一样提供一个数据更新的方法?DataSet到底有什么好处? 在本文中,我将对.net PetShop的数据库编程模式和Duwa

数据库设计方法、规范与技巧(推荐)

规范|技巧|设计|数据|数据库|数据库设计 数据库设计方法.规范与技巧(推荐)   一.数据库设计过程数据库技术是信息资源管理最有效的手段.数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求.数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求),在概念设计阶段形成独立于机器特点.独立于各个DBMS产品的概念模式(信息世界模型),用E-R图来描述.在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系

Java访问数据库的速度瓶颈问题的分析及解决

访问|解决|数据|数据库|速度|问题 内容: 速度瓶颈问题的提出 JDBC访问数据库的机制 不同模式的JDBC接口的选择 Java程序中SQL语句格式的优化 软件模型中对数据库访问的设计模式的优化 将深入研究的问题 参考资料 关于作者 FoolsGarden@SMTH 自由Java传道士 2001 年 11 月 速度瓶颈问题的提出 在企业级的Java应用中,访问数据库是一个必备的环节.数据库作为数据资源的集散地,往往位于企业级软件体系的后方,供前方的应用程序访问.在Java技术的体系中,应用程序

SQL数据库的恢复

  在前面两节,我们介绍了如何利用SQL Server Enterprise Manager 和BACKUP 命令进行备份以及SQL Server 提供的备份向导.本节我们将介绍部分数据库恢复,以及如何使用SQL Server Enterprise Manager 和RESTORE 命令进行数据库恢复. 15.5.1 利用Enterprise Manager 恢复数据库利用SQL Server Enterprise Manager 恢复数据库的操作步骤如下: (1) 启动SQL Server E

JavaBean操作Oracle数据库

oracle|数据|数据库 本文以一个完整的JavaBean数据库访问程序简要说明jsp操作数据库.  本程序由3个bean组成,其中WebConstants中定义全局变量,ConnectionManager管理数据库连接,MainBean利用WebConstants和ConnectionManager操作数据库. 首先定义全局变量,如下: package WebRelease; public interface WebConstants{  public static final String