zoukankan      html  css  js  c++  java
  • 概念学习


    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)

  • 相关阅读:
    Java连接Mysql数据库异常:Public Key Retrieval is not allowed
    java8的时间段比较处理工具类TimeUtils
    MAVEN最常用的远程仓库
    maven的settings.xml配置阿里云中央仓库
    idea如何将java程序打包成exe可执行文件
    FakerUtil
    Golang内存逃逸是什么?怎么避免内存逃逸?
    10个高效Linux技巧及Vim命令对比[转]
    进程间8种通信方式详解
    基于openresty的URL 断路器/熔断器 -- URL-fuse
  • 原文地址:https://www.cnblogs.com/learnbydoing/p/6719023.html
Copyright © 2011-2022 走看看