数据库基础概念
一、数据库
数据库(Database)
概念:按照数据结构来组织、存储和管理数据的仓库,统称数据库
分类:关系型数据库、非关系型数据库
关系型数据库:oracle,mysql,postgresql,DB2,SQL SERVER
非关系型数据库:
数据库管理系统(Database Management System)
概念:一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。
二、数据库驱动
JDBC(Java Data Base Connectivity)
概念:一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
驱动(Driver)
概念:java应用程序要想访问数据库,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道,其实也就是数据库厂商的JDBC接口实现.
例如 mysql的驱动jar包mysql-connector-java-XX.XX.XX 、 oracle的驱动jar包ojdbcXX.jar
JDBC和驱动的关系
如下图:JDBC提供统一规范,不同的关系型数据库提供对应的JDBC驱动程序(JDBC API的实现)

实现步骤
加载JDBC驱动程序 →建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
-
- 导入相关数据库驱动的jar包文件 : mysql的驱动jar包mysql-connector-java-XX.XX.XX 、 oracle的驱动jar包ojdbcXX.jar
- 装载驱动程序 :Class.forName("com.mysql.jdbc.Driver");
//装载MySql驱动: Class.forName("com.mysql.jdbc.Driver"); //装载Oracle驱动: Class.forName("oracle.jdbc.driver.OracleDriver");
- 建立连接 :Connection con = DriverManager.getConnection(url, user, password);
//连接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();
三、数据源
基本概念
作用:所有的用户都需要经过此五步进行操作,但是这五步之中有三步(加载数据库驱动程序、连接数据库、关闭数据库,释放连接)对所有人都是一样的,而所有人只有在操作数据库上是不一样,那么这就造成了性能的损耗。
那么最好的做法是,准备出一个空间,此空间里专门保存着全部的数据库连接,以后用户用数据库操作的时候不用再重新加载驱动、连接数据库之类的,而直接从此空间中取走连接,关闭的时候直接把连接放回到此空间之中。
未使用数据源:每次连接都创建Connection

使用数据源

原理:在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
通俗理解:数据库连接池就是准备一个池子,里面放着很多生成好的Connection,用户请求获得连接,就不需要getConnection,只要从池子里拿一个给他就行了,这样省掉了生成Connection的时间,效率上会有很大提高。
常用数据源:
DBCP 数据库连接池 (Tomcat内置)
C3P0 数据库连接池(Spring内置)
DBCP 讲解
C3P0 讲解
四、JNDI的概念以及和JDBC区别
JNDI(Java Naming and Directory Interface)
概念:从Java应用程序中访问名称和目录服务的一组API,有利于编程人员使用同一种方式来访问命名和目录服务
命名服务:命名服务在一个集中位置存储信息,这样用户、计算机和应用程序便可通过网络进行通信。命名服务使用名称查找对象,而不是对象的物理ID。
比如说在tomcat中查找JDBC数据源不是通过数据源的直接引用查找,而是通过JNDI与数据源绑定的名称查找
目录服务:目录服务是命名服务的扩展,目录服务的对象不单有名称,还有属性,既可以通过名称查找对象,也可以通过属性查找到一批对象然后筛选出自己需要的对象。
目录服务应该比命名服务更广发,它可以将整个网络中的资源和设备组织起来,形成一个大的目录,然后通过目录就可以定位资源和设备,实现集中管理。
服务结构:JNDI结构包括JNDI API和JNDI SPI
开发者通过JNDI API以一致的方式来访问各种命名服务、目录服务,而JNDI API则保证各种命名服务、目录服务透明的加入JNDI结构中,Naming Manager则负责管理二者之间的转换。
在开发企业级应用时,JNDI显得尤其重要:客户端代码可以通过JNDI来访问EJB,客户端代码需要通过JNDI来访问容器管理的数据源......Java EE应用中所有远程对象都需要通过JNDI来访问。

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

JNDI使用
JNDI数据源配置:
<!--配置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&characterEncoding=utf-8"/>
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语句 // TODO // 4.关闭连接,释放资源 conn.close();
浙公网安备 33010602011771号