`

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

 
阅读更多

   今天上午面试中,考官问我一个关于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实现中,没有注意到。

 

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

分享到:
评论
9 楼 mercyblitz 2010-07-16  
kimmking 写道
分布式的概念,比分布式事务的概念大得多。
支持分布式,和支持分布式事务,不是一回事。

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


嗯,JDBC的范畴在数据库,而分布式范围肯定更大。我所说的JDBC,想必你也明白了-支持分布式事务和连接。我觉得说JDBC支持Service Locator有点牵强。
8 楼 kimmking 2010-07-16  
分布式的概念,比分布式事务的概念大得多。
支持分布式,和支持分布式事务,不是一回事。

我知道你指的是分布式事务。只是你表达的不答,参见上面的回复。
7 楼 mercyblitz 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作为解释不得当。
6 楼 kimmking 2010-07-16  
<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>
<p> </p>
<p>URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。</p>
<p> 你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?</p>
<p>我们可以说某个JDBC驱动实现支持分布式,甚至某个数据库支持分布式。从没听说JDBC也支持分布式。</p>
</div>
<p>请看一下JSR JDBC4.0规范-12章 Distributed Transactions。</p>
</div>
<p><br>人家是 “分布式事务”,不是分布式的 JDBC,如果你可以发明一个分布式的DJDBC</p>
5 楼 mercyblitz 2010-07-16  
<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>
<p> </p>
<p>URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。</p>
<p> 你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?</p>
<p>我们可以说某个JDBC驱动实现支持分布式,甚至某个数据库支持分布式。从没听说JDBC也支持分布式。</p>
</div>
<p>请看一下JSR JDBC4.0规范-12章 Distributed Transactions。</p>
4 楼 kimmking 2010-07-16  
<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>
<p> </p>
<p>URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。</p>
<p> 你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?</p>
<p>我们可以说某个JDBC驱动实现支持分布式,甚至某个数据库支持分布式。从没听说JDBC也支持分布式。</p>
3 楼 stoneskin 2010-06-04  
钻牛角尖。。
2 楼 mercyblitz 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也支持分布式。
1 楼 jerryfeng 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思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。

相关推荐

    java Library.java

    7. **设计模式**:为保证代码的可扩展性和模块化,设计模式如工厂模式、单例模式、观察者模式可能会被应用。例如,使用工厂模式创建数据库连接,单例模式确保数据库连接池只有一个实例,观察者模式用于事件监听和...

    JAVA6高级编程代码4

    接下来,我们讨论MVC设计模式,这是一种在软件工程中广泛使用的架构模式,特别是在Web应用程序中。在Java世界中,Spring MVC是最受欢迎的实现之一。MVC模式将应用程序分为三个主要组件:模型(Model)负责业务逻辑和...

    java论坛管理系统设计(源代码+论文).zip

    2. **MVC架构**:系统采用Model-View-Controller(模型-视图-控制器)设计模式,分离业务逻辑、数据模型和用户界面,提高了代码的可维护性和可扩展性。 3. **Servlet与JSP**:Servlet负责处理用户请求,执行业务...

    Spring技术内幕:深入解析Spring架构与设计原理

    9. **设计模式**:书中可能通过Spring框架中的实际应用,解析和讨论各种设计模式,如工厂模式、单例模式、代理模式等,以加深读者对设计原则和最佳实践的理解。 10. **测试支持**:Spring提供丰富的测试框架,包括...

    基于java的俄罗斯方块项目.zip

    10. **社区协作与交流**:描述中提到“欢迎大家交流”,这意味着项目鼓励社区参与,学习者可以通过讨论和分享经验,提升自己的沟通和团队协作能力。 通过参与这样的项目,学习者不仅可以深化Java编程技能,还能了解...

    学习java必看的东西

    1. **设计模式**:jive项目中运用了大量的设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等。设计模式是软件工程中的最佳实践,理解和应用这些模式能帮助你编写出更高效、可维护的代码。 2. **Web应用...

    大公司JAVA面试试题

    面试是评估一个开发者技能的关键环节,对于大公司的Java面试,通常会涵盖广泛的知识点,包括基础语法、面向对象编程、集合框架、多线程、异常处理、IO流、网络编程、设计模式、JVM内存管理、数据库操作、算法与数据...

    java毕业设计-基于ssm的戒烟互助网站【代码+论文+PPT】

    SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,它将Web层进行职责解耦,分离了控制器、模型对象、分派器以及处理程序等。MyBatis是一个支持定制化SQL、存储过程以及高级映射的持久层...

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    [目录]EJB 的设计模式 6. [目录]Servlet Container 和 应用服务器 3. [目录]TOMCAT 9. [目录]纪念光盘精华区精选目录 1. [目录]Java编程 1. [目录]Java简单问题 2. [目录]为什么...

    基于linux的J2EE超市收银网站课程设计

    在J2EE框架下,通常会使用MVC(Model-View-Controller)设计模式,将业务逻辑、视图展示和数据处理分离,提高代码的可维护性和可扩展性。 此外,项目中提到,开发者需要在原有的Java基础上学习如何在Linux环境中...

    duirdtest.rar

    单例模式是一种常用的软件设计模式,确保一个类只有一个实例,并提供一个全局访问点。在Java中,我们可以使用枚举来实现单例模式,这是一种安全且线程友好的方式。枚举单例模式避免了传统实现中可能出现的多线程问题...

    JSP程序开发范例宝典第7、8章(光盘)源码

    3. MVC设计模式:讨论如何在JSP中应用MVC(Model-View-Controller)设计模式,以实现良好的应用程序结构。 4. JSTL(JSP Standard Tag Library):介绍JSTL库,包括核心标签、JDBC标签、XML标签等,以及如何将它们...

    JSP简易bbs社区论坛

    同时,MVC(Model-View-Controller)设计模式可能会被应用,以分离业务逻辑、数据模型和用户界面。此外,JSTL(JavaServer Pages Standard Tag Library)和EL可能用于简化JSP页面的编写,提高代码可读性。 总的来说...

    【面试】Java面试知识卡片大全.zip

    7. **设计模式**:常见的设计模式如单例、工厂、观察者、装饰器、适配器、代理等,是衡量开发者解决问题能力的重要标准。理解并能灵活运用设计模式是提升代码质量和可维护性的关键。 8. **JVM内存模型**:了解Java...

    mysql.rar_学习系统java

    在构建管理系统时,你可能还会接触到DAO(Data Access Object)模式,这是一种设计模式,用于在业务逻辑和数据库访问之间提供一个抽象层。这有助于保持代码的整洁,提高可维护性,并使你的应用能在不修改业务逻辑的...

    Java语言程序设计第38-48章

    学习这一章,读者可以理解如何使用JSF创建可复用的UI组件,并实现MVC(Model-View-Controller)设计模式。 第44章“Java 2D”介绍了Java中的二维图形处理系统,包括如何绘制线条、形状、文本以及图像,以及复杂的...

    班级管理系统

    4. **DAO(Data Access Object)模式**:DAO模式是一种设计模式,用于封装对数据库的操作,提供了一层抽象,使得业务逻辑与数据访问逻辑分离,提高代码复用性。 5. **实体类(Entity Classes)**:为表对应的Java类...

    基于java的高校学生选课系统项目源码.zip

    2. **MVC设计模式**:通常在Web应用开发中,Model-View-Controller(MVC)模式被广泛应用。模型负责数据处理和业务逻辑,视图负责展示数据,控制器协调模型和视图的交互。学生选课系统可能采用这种架构,以提高代码...

Global site tag (gtag.js) - Google Analytics