数据库、数据源、数据库连接池、JDBC,JNDI等知识点整理

来源:互联网 发布:心书网络 更新朋友圈 编辑:程序博客网 时间:2024/06/04 19:13

很多java软件开发者初学者,在学习数据库与java应用程序时,难免会遇到一些困扰,现在根据自己的学习和应用,为大家简单整理了一些资料,希望能帮助到大家,不足之处还望指正。

本文章为大家介绍一下相关概念及应用联系。关于JDBC、数据库连接池、JNDI等知识的详细配置和使用,会在接下来的博客中为大家具体介绍


简单介绍一下数据库概念

1.数据库(Database)

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,当前使用最多的是关系型数据库,常见数据库软件包括:oracle,mysql,postgresql,DB2,SQL SERVER....


2.数据库管理系统(Database Management System)

数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库.


认识数据库之后,马上在java的应用程序中使用JDBC调用数据库

3.java数据库连接(Java Data Base Connectivity,即JDBC)

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。





JDBC的实现步骤(联接DBMS):

加载JDBC驱动程序 →建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源

①导入相关数据库驱动的jar包文件

我们的java应用程序要想访问数据库,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。

mysql的驱动jar包mysql-connector-java-XX.XX.XX:下载地址https://dev.mysql.com/downloads/connector/j/

oracle的驱动jar包ojdbcXX.jar:http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html


②装载驱动程序

加载 Driver 类后,它们即可用来与数据库建立连接。

调用 Class.forName 将自动加载驱动程序类,只需要非常简单的一行代码。

Class.forName("XXX.XXX.XXX");

  Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

  装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");

  装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

③建立连接

Connection con = DriverManager.getConnection(url, user, password);

Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。

  连接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

  连接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

  连接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");


④操作数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)

⑤关闭数据库,释放连接(con.close();)

(关于JDBC详细使用可以访问 http://www.cnblogs.com/erbing/p/5805727.html)


从上述JDBC实现步骤发现,所有的用户都需要经过此五步进行操作,但是这五步之中有三步(加载数据库驱动程序、连接数据库、关闭数据库,释放连接)对所有人都是一样的,而所有人只有在操作数据库上是不一样,那么这就造成了性能的损耗。
那么最好的做法是,准备出一个空间,此空间里专门保存着全部的数据库连接,以后用户用数据库操作的时候不用再重新加载驱动、连接数据库之类的,而直接从此空间中取走连接,关闭的时候直接把连接放回到此空间之中。
那么此空间就可以称为连接池(保存所有的数据库连接)

所以在实际应用开发中,数据源和数据库连接池的应用就显得尤为重要。


4.数据源(DataSource

Java中的数据源就是javax.sql.DataSource。DataSource的创建可以有不同的实现。DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池。(copy from 《数据源和数据库连接池》)


每一个数据库实例里面包含多张table,多个存储过程,多个索引,多个约束等,而每个表里面都有很多字段列。数据源所依附的对象是数据库软件(oracle,mysql...),只要安装有这个软件就有数据源,不管你有没有创建自己的数据库实例,数据源都是存在的而且一般一个数据库软件都会只有一个数据源。数据源包含两个部分:连接池和连接管理。


5.数据库连接池

连接池基本的思想,原理:

  在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

连接池通俗理解:  

  数据库连接池就是准备一个池子,里面放着很多生成好的Connection,用户请求获得连接,就不需要getConnection,只要从池子里拿一个给他就行了,这样省掉了生成Connection的时间,效率上会有很大提高


①应用程序直接获取连接的缺点(图解)


②使用数据库连接池优化程序性能(图解)



开源数据库连接池介绍 

现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSource的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。

也有一些开源组织提供了数据源的独立实现:

DBCP 数据库连接池 (Tomcat内置)

C3P0 数据库连接池(Spring内置)

简而言之,使用开源数据源,就是为了获取其DataSource对象,然后通过该对象动态的地获取数据库连接


很多初学者认为从项目的TOMCAT配置文件中发现类似数据库连接池的配置,认为JNDI也是数据库连接池的一种,这种理解明显是错误的,JNDI和JDBC、数据库连接池是不同的概念,下面简单介绍一下JNDI,关于JNDI在java应用程序的详细使用以及配置,接下来的博客中都会给大家介绍

6.JNDI

Java命名和目录接口(Java Naming and Directory Interface ,JNDI)是用于从Java应用程序中访问名称和目录服务的一组API。命名服务即将名称与对象相关联,以便能通过相应名称访问这些对象。而目录服务即其对象具有属性及名称的命名服务。

命名或目录服务允许您集中管理共享信息的存储,这在网络应用程序中很重要,因为它可以使这类应用程序更加一致和易于管理。例如,可以将打印机配置存储在目录服务中,这样所有与打印机相关的应用程序都能够使用它。
                                                                                               -----来自java.sun.com:



JNDI架构提供了一个标准的、与命名系统无关的API,这个API构建在特定于命名系统的驱动程序之上。这一层帮助把应用程序和实际的数据源隔离开来,因此无论应用程序是访问LDAP、RMI、DNS还是其他的目录服务,这都没有关系。换句话说,JNDI与任何特定的目录服务实现无关,您可以使用任何目录,只要您拥有相应的服务提供程序接口(或驱动程序)即可,如图下图所示。

JNDI结构包括JNDI API和JNDI SPI
开发者通过JNDI API以一致的方式来访问各种命名服务、目录服务,而JNDI API则保证各种命名服务、目录服务透明的加入JNDI结构中,Naming Manager则负责管理二者之间的转换。
在开发企业级应用时,JNDI显得尤其重要:客户端代码可以通过JNDI来访问EJB,客户端代码需要通过JNDI来访问容器管理的数据源......Java EE应用中所有远程对象都需要通过JNDI来访问。



使用JNDI配置数据源转自http://www.cnblogs.com/lyy-2016/p/5742958.html


系统服务启动时,应该与数据库维持一定数量的连接,等待用户使用。
如果连接已经满了,则必须打开新的连接,供更多用户使用。
如果一个服务器就只能有100个连接,那么如果有第101个人过来呢?应该等待其他用户释放连接
如果一个用户等待时间太长了,则应该告诉用户,操作是失败的。
直接用程序实现以上功能,则会比较麻烦,所以在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项, 直接在服务器上配置好数据源连接池即可。在J2EE服务器上保存着一个数据库的多个连接。每一个连接通过DataSource可以找到。DataSource被绑定在了JNDI树上(为每一个DataSource提供一个名字)客户端通过名称找到在JNDI树上绑定的DataSource,再由DataSource找到一个连接。如下图所示:




JNDI数据源配置:

在server.xml中添加全局JNDI数据源配置,在<GlobalNamingResources>下继续添加<Resource>标签,或者在context.xml中添加<Resource>标签,常见的几个数据库的配置如下所示:
<!--配置Oracle数据库的JNDI数据源-->
<Resource
        name="jdbc/oracle"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="100"
        maxIdle="30"
        maxWait="10000"
        username="lead_oams"
        password="p"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        url="jdbc:oracle:thin:@192.168.1.229:1521:lead"/>
 
<!--配置MySQL数据库的JNDI数据源-->
<Resource
        name="jdbc/mysql"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="100"
        maxIdle="30"
        maxWait="10000"
        username="root"
        password="root"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://192.168.1.144:3306/leadtest?useUnicode=true&amp;characterEncoding=utf-8"/>

备注:TOMCAT默认使用的是DBCP数据库连接池,所以上述通过JNDI获取数据源其实是TOMCAT默认使用的DBCP数据源。


java应用程序中调用如下:
// java:comp/env/为固定值,不可变更
String gENV = "java:comp/env/";
// 上下文实例
Context ctx = new InitialContext();

// 1.获取数据源(gENV+配置中name属性值)
DataSource ds = (DataSource)ctx.lookup(gENV+"jdbc/oracle");
// 2. 获取连接
Connection conn = ds.getConnection();

// 3.执行SQL语句
.....
// 4.关闭连接,释放资源
conn.close();
 

好了,先介绍到这里,详细使用后续介绍..............

参照文章:http://www.cnblogs.com/lyy-2016/p/5742958.html
                  http://www.cnblogs.com/erbing/p/5805727.html




1 0
原创粉丝点击