论坛首页 Java企业应用论坛

JDBC 设计模式 (欢迎大家讨论)

浏览 6644 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-06-02   最后修改:2010-07-16

   今天上午面试中,考官问我一个关于JDBC的设计模式的问题,但是回答是利用Bridge模式、Service Locator。后来,我想了仔细想了一下,其实还有一些。

 

为什么是Bridge呢?

 

    因为JDBC驱动中,有一个jdbc-odbc,这个利用桥接模式。从Drvier到Connection中的DriverManager,Connection到ResultSet的Statement,这两个对象不是起了Bridge对象的作用吗?同时JDBC的接口和驱动类实现也是分离的。

 

为什么是Service Locator呢?

 

    在JDBC驱动加载是,需要URL参数,这个东西和JDNI类似,通过“命名空间”。我当时没有记错,经过核实,它确实通过Provider来提供具体的实现。JDBC,XML,NIO等技术,JDK采用的SPI的机制。

 

   上述说法难免牵强,因此删除。

 

还有那些?

 

   抽象工厂:如果把Connection,Statement作为工厂类的话,那么自然他们是抽象工厂,Connection可以产生抽象的工厂Statement或者PreparedStatement。

 

   单例模式:通过ClassLoader加载java.sql.Drvier的实现类,JDBC系统会保存一个单例。

 

   组合模式:JDBC驱动中,底层的Connection实现,需要知道Driver的元信息,自然,Statement也需要Connection。至少,MySQL是这么实现的。

 

   但是我考虑没有把adapter作为答案,因为我觉得JDBC驱动实现是一种接口编程,没有过多的类型适配,也不存在接口兼容。至少,我在MySQL实现中,没有注意到。

 

   作者知识有限,欢迎大家一起讨论和指正,谢谢。

   发表时间:2010-06-03   最后修改:2010-06-03
说到JDBC的设计,首先想到就是AbstractFactory
不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂

至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是

Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系

Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。
0 请登录后投票
   发表时间:2010-06-03  
jerryfeng 写道
说到JDBC的设计,首先想到就是AbstractFactory
不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂

至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是

Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系

Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。



DriverManager 确实是利用ClassLoader来实现的,可能我的表达有误。

JDBC的URL也是一种远程连接,他也是通过自己的“命名域”来获得Connection,JDBC也支持分布式。
0 请登录后投票
   发表时间:2010-06-04  
钻牛角尖。。
0 请登录后投票
   发表时间:2010-07-16  
mercyblitz 写道
jerryfeng 写道
说到JDBC的设计,首先想到就是AbstractFactory
不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂

至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是

Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系

Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。



DriverManager 确实是利用ClassLoader来实现的,可能我的表达有误。

JDBC的URL也是一种远程连接,他也是通过自己的“命名域”来获得Connection,JDBC也支持分布式。

 

URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。

 你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?

我们可以说某个JDBC驱动实现支持分布式,甚至某个数据库支持分布式。从没听说JDBC也支持分布式。

0 请登录后投票
   发表时间:2010-07-16  
kimmking 写道
mercyblitz 写道
jerryfeng 写道
说到JDBC的设计,首先想到就是AbstractFactory
不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂

至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是

Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系

Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。



DriverManager 确实是利用ClassLoader来实现的,可能我的表达有误。

JDBC的URL也是一种远程连接,他也是通过自己的“命名域”来获得Connection,JDBC也支持分布式。

 

URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。

 你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?

我们可以说某个JDBC驱动实现支持分布式,甚至某个数据库支持分布式。从没听说JDBC也支持分布式。

请看一下JSR JDBC4.0规范-12章 Distributed Transactions。

0 请登录后投票
   发表时间:2010-07-16   最后修改:2010-07-16
mercyblitz 写道
kimmking 写道
mercyblitz 写道
jerryfeng 写道
说到JDBC的设计,首先想到就是AbstractFactory
不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂

至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是

Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系

Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。



DriverManager 确实是利用ClassLoader来实现的,可能我的表达有误。

JDBC的URL也是一种远程连接,他也是通过自己的“命名域”来获得Connection,JDBC也支持分布式。

 

URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。

 你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?

我们可以说某个JDBC驱动实现支持分布式,甚至某个数据库支持分布式。从没听说JDBC也支持分布式。

请看一下JSR JDBC4.0规范-12章 Distributed Transactions。


人家是 “分布式事务”,不是分布式的 JDBC,如果你可以发明一个分布式的DJDBC

0 请登录后投票
   发表时间:2010-07-16  
kimmking 写道
<div class="quote_title">mercyblitz 写道</div>
<div class="quote_div">
<div class="quote_title">kimmking 写道</div>
<div class="quote_div">
<div class="quote_title">mercyblitz 写道</div>
<div class="quote_div">
<div class="quote_title">jerryfeng 写道</div>
<div class="quote_div">说到JDBC的设计,首先想到就是AbstractFactory <br>不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂 <br><br>至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是 <br><br>Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系 <br><br>Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。</div>
<br><br><br>DriverManager 确实是利用ClassLoader来实现的,可能我的表达有误。 <br><br><span style="color: #ff00ff;">JDBC的URL也是一种远程连接,他也是通过自己的“命名域”来获得Connection,JDBC也支持分布式。</span> </div>
 

URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。

 你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?

我们可以说某个JDBC驱动实现支持分布式,甚至某个数据库支持分布式。从没听说JDBC也支持分布式。

</div>
请看一下JSR JDBC4.0规范-12章 Distributed Transactions。

</div>
<br>人家是 “分布式事务”,不是分布式的 JDBC,如果你可以发明一个分布式的DJDBC


我是说JDBC能够支持分布式,规范中规定XADataSource and XAConnection 可以提供多数据源和连接。JDBC只提供了接口,驱动提供实现。我貌似没有说错,JDBC可以通过JNDI获取DataSource,在Java EE核心模式中提到JNDI作为Service Locator。不过,使用URL作为解释不得当。
0 请登录后投票
   发表时间:2010-07-16   最后修改:2010-07-16
分布式的概念,比分布式事务的概念大得多。
支持分布式,和支持分布式事务,不是一回事。

我知道你指的是分布式事务。只是你表达的不答,参见上面的回复。
0 请登录后投票
   发表时间:2010-07-16  
kimmking 写道
分布式的概念,比分布式事务的概念大得多。
支持分布式,和支持分布式事务,不是一回事。

我知道你指的是分布式事务。只是你表达的不答,参见上面的回复。


嗯,JDBC的范畴在数据库,而分布式范围肯定更大。我所说的JDBC,想必你也明白了-支持分布式事务和连接。我觉得说JDBC支持Service Locator有点牵强。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics