罗明的博客
... ...
讨论Eclipse, Java, Linux, Google产品
              

问题虚拟背景:
A项目组要实现一个基于Sql Server的应用,但工作环境只安装有MySql(公司对开源比较看好: )),而且客户有可能会转移到Oracle数据库环境。要求应用具有数据库移植能力和快速更换能力,使应用在工作环境调试成功后能迅速转移到客户的Sql Server环境,而且将来可以方便地转向Oracle。

Andy提出的可用方案:
1、使用标准JDBC
2、使用抽象类定义数据访问单元
3、定义具体数据源访问单元继承2中接口

代码示例:
定义数据访问单元抽象类,包含数据访问逻辑

public abstract class DataManager
{
 
protected static String conString = null;
 
protected static String urlString = null;
 
public DataType[ ] getData()
 
{
   
//fetch data using standard JDBC with conString and urlString
 }


 
public void setData(DataType[ ] dataArray)
 
{
   
//store data using standard JDBC with conString and urlString
 }

}

定义具体数据源访问单元

public class HsqlDataManager extends DataManager
{
 
static
 
{
  conString 
= "org.hsqldb.jdbcDriver";
  urlString 
= "jdbc:hsqldb:db/YourDatabaseName";
 }

}


public class OdbcBlogManager extends AbstractBlogManager
{
 
static
 
{
  conString 
= "sun.jdbc.odbc.JdbcOdbcDriver";
  urlString 
= "jdbc:odbc:db/YourDatabaseName";
 }

}


在调用数据访问层时,可以声明一个DataManager的引用,然后在构造器中实例化为具体子类,如:

public class Andy
{
 
private DataManager dataManager = null;
 
 
public Andy
 
{
  dataManager 
= new HsqlDataManager();
  
//或者在资源文件里填写具体子类,然后在这里动态加载并实例化
 }
 

 
public void doSomething()
 
{
  dataManager.getData();
  
 }

}


以后要迁移到另一个数据库(有JDBC驱动),只需定义具体子类继承DataManager(如HsqlDataManager),然后修改资源文件中的DataManager名称(或者将new的类名改一下),不需要修改代码。

这兴许可以解释另一个问题:不赞成使用存储过程,而应将SQL语句嵌在代码中(适用于Java;微软注定.Net不会有平台移植性,数据库大都用Sql Server,所以写存储过程还是比较好的)。

(我在我的一个Eclipse RCP项目里使用了这种模式,从Sql server 2000到Hsql,特别方便,看起来感觉也比较好)

欢迎大家拍转,^_^



版权所有 罗明
posted on 2005-10-06 15:49 罗明 阅读(865) 评论(2)  编辑  收藏 所属分类: JavaProgramTech
Comments
  • # re: 使应用具有快速更换数据库能力
    tom
    Posted @ 2005-10-07 08:20
    HIBERNATE  回复  更多评论   
  • # re: 使应用具有快速更换数据库能力
    Andy luo
    Posted @ 2005-10-07 08:31
    嗯,good  回复  更多评论   

只有注册用户登录后才能发表评论。


网站导航: