layout: post

title: 概念学习 - JNDI, JDBC, ODBC, DataSource

最近在学习Java Hibernate,对数据库资源访问这块好多概念模糊,所以在此记录一下, 如有错误 盼指正。

Data Source

It is

physically a set of data stored somewhere like a database;

abstractly it is DataSource object used to get connection to a database;

访问这些数据需要什么?

Give the Data Source a NAME i.e. DSN (Data Source Name) which describes informations to access it:

  • location
  • access right
  • driver
  • name
  • ...

都有哪些DSN?

  • User DSN
  • System DSN
  • File DSN

如何访问Data Source呢?

Data Source是存在数据库中的,访问这些数据要用到sql 语句。

应用程序呢,是用特定编程语言比如Java, C#等写的,程序中需要使用Data Source。

这就存在一个问题,这些编程语言和sql语言之间如何talk呢?

显然需要一个翻译机制来实现。

于是便有了ODBC and JDBC...

ODBC

ODBC is

Open Database Connectivity
它统一了对各种不同类型数据库的访问接口
是应用程序和数据库之间的中间件
Language Indepenent (适用any application to access any database)

类比:JVM 使java 可以跨平台使用,ODBC使应用程序可以跨数据库使用(移植数据库方便)

配置ODBC数据源

ODBC 数据源得配置是OS level的,是不依赖任何数据库系统的,不直接与数据库打交道,与数据库实际操作都是通过各数据库的ODBC Driver来实现的。

如上面三种DSN的配置,在windows中直接到Control Panel -> Administrator -> ODBC 中配置即可。

JDBC

 Java Database Connectivity
纯Java接口规范
Java Language specific

why jdbc when there is already ODBC?

最简单的一句话是,ODBC是使用C语言接口的,java直接调C...sounds not very good.

连接数据库

Java 程序员可以使用:

  • JDBC-to-ODBC bridge to talk to any ODBC compliant database.
  • JDBC driver directly to talk to database

JNDI

Why?

既然有了ODBC, JDBC, 那为什么还要JNDI?

一个简单的原因是,程序员需要在程序中使用odbc, jdbc 连接配置信息来访问数据库。这些信息直接写在程序中好吗?如果要用到多个连接信息呢?

是什么?

Java naming and directory Interface (JAVA API)

Java 接口规范。

从根本上讲,JNDI是一个目录服务。比如你在手机里查询某人的电话,输入名字手机返回你这个人的电话。这里的手机就相当于JNDI的作用。

在java中可以这么理解:

首先给出一个Name(比如Data source name),
java 返回你一个Object对象(比如DataSource object)。
然后你可以通过这个DataSource object 来获取与数据库的连接,
进而作各种数据库的操作。
最后关闭数据库连接等。

Sample Code: ([参考][1])

`private static void ConnectDBWithJNDI(String jndiName) throws 	NamingException, SQLException {
Context ctx=new InitialContext();
Object obj=ctx.lookup(jndiName);
DataSource ds=(DataSource)obj;
conn=ds.getConnection();
conn.setAutoCommit(false);
conn.commit();
conn.close();
} private static void ConnectDBWithoutJNDI(String driverName, String jdbcLink) throws ClassNotFoundException, SQLException {
Class.forName(driverName, true, Thread.currentThread().getContextClassLoader());
conn = DriverManager.getConnection(jdbcLink);
conn.setAutoCommit(false);
conn.commit();
conn.close();
}`

Extension:

当然JNDI不仅限于数据库目录服务,很多诸如LDAP,文件系统等都支持。

类似的目录服务还有 WebService 中的 UDDI (Universal Description, Discovery and Integration)

概念学习 - JNDI, JDBC, ODBC, DataSource的更多相关文章

  1. Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案

    Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案 1. 跨语言db api兼容性..1 2. 目前访问数据库的接口很多.比较常用的jdbc odbc 以 ...

  2. JDBC数据源(DataSource)数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。

    JDBC数据源(DataSource)的简单实现   数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用. 2.数据源提供了一种简单获取数据库连接的方式,并能在内部通 ...

  3. JDBC ODBC区别

    一.JDBC(Java DataBase Connectivity standard) 1.JDBC,它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库. 2. 驱动程序(JDBC ...

  4. JSP使用JDBC ODBC 实例

    1.JDBC ODBC Brige driver是JSP连接数据库的驱动,只要安装了JDK这个驱动就默认安装了 2. 配置JDBC ODBC数据源的步骤:http://blog.csdn.net/li ...

  5. 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器

    第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...

  6. java 8: ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver

    转眼之间, java 11都快要推出了. 而我一直都在 java 7环境下写代码,真的不想升级,不想改变什么,可世界每天都在变化. 最近因为服务端需要SNI,而 java 7 只支持客户端的SNI,只 ...

  7. Connection conn = DriverManager.getConnection("jdbc:odbc:bbs");

    Connection conn = DriverManager.getConnection("jdbc:odbc:bbs"); 这是JDBC连接数据库的时候用的一句话,,Conne ...

  8. 第5章 JDBC/ODBC服务器

    第5章 JDBC/ODBC服务器 Spark SQL也提供JDBC连接支持,这对于让商业智能(BI)工具连接到Spark集群上以 及在多用户间共享一个集群的场景都非常有用.JDBC 服务器作为一个独立 ...

  9. Java使用JNDI技术获取DataSource对象

    package common; import java.sql.Connection; import java.sql.SQLException; import javax.naming.Contex ...

随机推荐

  1. WeMall微信商城签到插件Sign的主要源码

    WeMall微信商城源码签到插件Sign,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace Ad ...

  2. 2761: [JLOI2011]不重复数字(平衡树)

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2133  Solved: 825[Submit][Stat ...

  3. 2431: [HAOI2009]逆序对数列

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 954  Solved: 548[Submit][Status ...

  4. C++—引用的作用

    引入 C语言中函数有两种传参的方式: 传值和传址.以传值方式, 在函数调用过程中会生成一份临时变量用形参代替, 最终把实参的值传递给新分配的临时变量即形参. 它的优点是避免了函数调用的副作用, 确无法 ...

  5. Linux supervisord配置使用

    supervisor官方网站 http://supervisord.org 1.安装supervisord Ubuntu: $sudo apt-get install python-setuptool ...

  6. nao安装中文包教程

    本文介绍nao离线安装中文包 相官方索取 .demo 文件夹,里面包含很多的例程和中文包 下载winscp和putty(或者xshell),下载过程和安装我就不多说了,免费 把nao开机,连接路由器等 ...

  7. 有个程序猿要去当CEO了:(二)扬帆起航

    合同签好了. 从昨天下午三点半,一直修改到晚上七点半,才确定签下. 这过程中,有一点讨论得比较久: 就是甲方要不要也拿底薪. 甲方是这样说的:"总经理拿N仟元,董事长不要说比总经理高,但是也 ...

  8. 浅谈HashMap的内部实现

    权衡时空 HashMap是以键值对的方式存储数据的. 如果没有内存限制,那我直接用哈希Map的键作为数组的索引,取的时候直接按索引get就行了,可是地价那么贵,哪里有无限制的地盘呢. 如果没有时间限制 ...

  9. CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解

    派生选择器用的很多,派生选择器具体包括为后代选择器.子元素选择器.相邻兄弟选择器,我们来理解一下他们之间的具体用法与区别. 1.css后代选择器语法:h1 em {color:red;} 表示的是从h ...

  10. CSS3 贝塞尔曲线实现

    cubic-bezier 曲线是 css3 动画的一个重要基石.另一个为 steps (ease 等都是 cubic-bezier 的特殊形式),css3 中的 cubic_bezier 曲线限制了首 ...