博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNDI学习总结(一)——JNDI数据源的配置
阅读量:5091 次
发布时间:2019-06-13

本文共 10451 字,大约阅读时间需要 34 分钟。

原文地址:

一、数据源的由来

  在Java开发中,使用JDBC操作数据库的四个步骤如下:

  ①加载数据库驱动程序(Class.forName("数据库驱动类");)
   ②连接数据库(Connection con  = DriverManager.getConnection();)
   ③操作数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
   ④关闭数据库,释放连接(con.close();)
  也就是说,所有的用户都需要经过此四步进行操作,但是这四步之中有三步(①加载数据库驱动程序、②连接数据库、④关闭数据库,释放连接)对所有人都是一样的,而所有人只有在操作数据库上是不一样,那么这就造成了性能的损耗。
  那么最好的做法是,准备出一个空间,此空间里专门保存着全部的数据库连接,以后用户用数据库操作的时候不用再重新加载驱动、连接数据库之类的,而直接从此空间中取走连接,关闭的时候直接把连接放回到此空间之中。
  那么此空间就可以称为连接池(保存所有的数据库连接),但是如果要想实现此空间的话,则必须有一个问题要考虑?
    1、 如果没有任何一个用户使用连接,那么那么应该维持一定数量的连接,等待用户使用。
   2、 如果连接已经满了,则必须打开新的连接,供更多用户使用。
   3、 如果一个服务器就只能有100个连接,那么如果有第101个人过来呢?应该等待其他用户释放连接
   4、 如果一个用户等待时间太长了,则应该告诉用户,操作是失败的。
  如果直接用程序实现以上功能,则会比较麻烦,所以在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可。在J2EE服务器上保存着一个数据库的多个连接。每一个连接通过DataSource可以找到。DataSource被绑定在了JNDI树上(为每一个DataSource提供一个名字)客户端通过名称找到在JNDI树上绑定的DataSource,再由DataSource找到一个连接。如下图所示:
  
  那么在以后的操作中,除了数据库的连接方式不一样之外,其他的所有操作都一样,只是关闭的时候不是彻底地关闭数据库,而是把数据库的连接放回到连接池中去。
  如果要想使用数据源的配置,则必须配置虚拟目录,因为此配置是在虚拟目录之上起作用的。需要注意的是,如果要想完成以上的功能,在Tomcat服务器上一定要有各个数据库的驱动程序。

二、JNDI+Tomcat配置数据源的两种方式

2.1、全局jndi配置

  此种配置需要在server.xml中配置数据源,具体的配置步骤如下:

  1、在tomcat服务器的lib目录下加入数据库连接的驱动jar包

  

  2、修改tomcat服务器的conf目录下server.xml配置文件

  

  打开server.xml配置文件,可以看到里面自带的一个全局JNDI配置,如下图所示:

  

  编辑server.xml文件,添加全局JNDI数据源配置,配置如下:

1 
4
5
8
13
26
27
38 39
40
51 52
53
64 65

  经过以上的两个步骤,全局JNDI数据源就配置好了,在上述的server.xml文件中,分别配置了Oracle、MySQL、SQLServer这三种数据库的全局JNDI数据源。

2.2、全局jndi数据源测试

  1、创建一个JNDI测试项目JNDITest,在web.xml中添加JNDI配置的资源引用

  

  web.xml的配置如下:

1 
2
7
8
index.jsp
9
10 11
17
18
19
Oracle DB Connection
20
oracleDataSource
21
javax.sql.DataSource
22
Container
23
24 25
26
27
MySQL DB Connection
28
mysqlDataSource
29
javax.sql.DataSource
30
Container
31
32 33
34
35
SQLServer DB Connection
36
sqlserverDataSource
37
javax.sql.DataSource
38
Container
39
40 41

  2、映射JNDITest项目的虚拟目录

  在tomcat的\conf\Catalina\localhost下(没有目录就新建)创建一个xml文件,文件名必须和项目名相同,测试JNDI数据源的web项目的项目名称是:JNDITest,所以xml文件的命名就叫JNDITest.xml,如下图所示:

  

  编辑JNDITest.xml,配置如下:

1 
2
6
7
8
9
10
11
12
13
14

  3、测试从JNDI数据源获取数据库连接

  配置完数据源连接池之后,就可以按照以下的步骤进行访问:

  • 初始化名称查找上下文
   • 通过JNDI名称找到DataSource
   • 通过DataSource取得一个连接
   • 操作数据库
   • 关闭数据库,关闭的时候是将连接放回到连接池之中

  jsp测试页面代码如下:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  2 <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>  3   4   5   6     7     JNDI数据源测试  8     9    10    11         <% 12             Connection connOracle = null; 13             try { 14                 //1、初始化名称查找上下文 15                 Context ctx = new InitialContext(); 16                 //InitialContext ctx = new InitialContext();亦可  17                 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名 18                 /* 19                 DataSource名在web.xml文件中的
oracleDataSource
进行了配置 20
21
22
Oracle DB Connection
23
oracleDataSource
24
javax.sql.DataSource
25
Container
26
27 */ 28 DataSource ds = (DataSource)ctx.lookup("java:comp/env/oracleDataSource"); 29 //3、通过DataSource取得一个连接 30 connOracle = ds.getConnection(); 31 out.println("Oracle Connection pool connected !!"); 32 //4、操作数据库 33 } catch (NamingException e) { 34 System.out.println(e.getMessage()); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } finally { 38 //5、关闭数据库,关闭的时候是将连接放回到连接池之中 39 connOracle.close(); 40 } 41 %> 42

43 <% 44 Connection connMySQL = null; 45 try { 46 //1、初始化名称查找上下文 47 Context ctx = new InitialContext(); 48 //InitialContext ctx = new InitialContext();亦可 49 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名 50 /* 51 DataSource名在web.xml文件中的
mysqlDataSource
进行了配置 52
53
54
MySQL DB Connection
55
mysqlDataSource
56
javax.sql.DataSource
57
Container
58
59 */ 60 DataSource ds = (DataSource)ctx.lookup("java:comp/env/mysqlDataSource"); 61 //3、通过DataSource取得一个连接 62 connMySQL = ds.getConnection(); 63 out.println("MySQL Connection pool connected !!"); 64 //4、操作数据库 65 } catch (NamingException e) { 66 System.out.println(e.getMessage()); 67 } catch (SQLException e) { 68 e.printStackTrace(); 69 } finally { 70 //5、关闭数据库,关闭的时候是将连接放回到连接池之中 71 connMySQL.close(); 72 } 73 %> 74

75 <% 76 Connection connSQLServer = null; 77 try { 78 //1、初始化名称查找上下文 79 Context ctx = new InitialContext(); 80 //InitialContext ctx = new InitialContext();亦可 81 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面的是DataSource名 82 /* 83 DataSource名在web.xml文件中的
sqlserverDataSource
进行了配置 84
85
86
SQLServer DB Connection
87
sqlserverDataSource
88
javax.sql.DataSource
89
Container
90
91 */ 92 DataSource ds = (DataSource)ctx.lookup("java:comp/env/sqlserverDataSource"); 93 //3、通过DataSource取得一个连接 94 connSQLServer = ds.getConnection(); 95 out.println("SQLServer Connection pool connected !!"); 96 //4、操作数据库 97 } catch (NamingException e) { 98 System.out.println(e.getMessage()); 99 } catch (SQLException e) {100 e.printStackTrace();101 } finally {102 //5、关闭数据库,关闭的时候是将连接放回到连接池之中103 connSQLServer.close();104 }105 %>106 107

  运行结果如下:

  

  除了可以在Jsp页面中编写java代码测试JNDI数据源连接之外,还有一种比较简单的方式就是使用JSTL标签库提供的sql标签进行测试,测试代码如下:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%--引入JSTL标签库 --%> 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> 5  6  7    8     JNDI数据源连接测试 9   10   11   12           

Oracle JNDI数据源测试

13 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>14
15 <%--Oracle JNDI数据源测试 SQL--%>16 SELECT * FROM LEAD_OAMS_DBSOURCES17
18 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>19
20 <%--${row.字段名}获取字段的值--%>21 ${row.RESOURCEID}---${row.DBSOURCE_NAME}---${row.DBSOURCE_TYPE}
22
23

24

MySQL JNDI数据源测试

25 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>26
27 <%--MySQL JNDI数据源测试 SQL--%>28 select * from ld_user29
30 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>31
32 <%--${row.字段名}获取字段的值--%>33 ${row.id}---${row.username}---${row.password}
34
35

36

SQLServer JNDI数据源测试

37 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>38
39 <%--SQLServer JNDI数据源测试 SQL--%>40 select * from t_demo41
42 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>43
44 <%--${row.字段名}获取字段的值--%>45 ${row.id}---${row.time}
46
47 48

  运行结果如下:

  

2.3、非全局jndi配置

  非全局JNDI数据源是针对某一个Web项目配置的数据源,具体的配置步骤如下:

  1、在tomcat服务器的lib目录下加入数据库连接的驱动jar包

   2、针对具体的web项目映射虚拟目录,然后在虚拟目录映射的配置文件中配置JNDI数据源

  还是以上面的JNDITest项目为例子进行说明

  在tomcat目录下的\conf\Catalina\localhost目录下创建一个JNDITest.xml文件,如下图所示:

  

  编辑JNDITest.xml文件,添加对JNDITest项目的虚拟目录的映射和JNDI数据源的配置

1 
2
6 7
8
21
22
33 34
35
46 47
48
59

  3、在web项目的web.xml文件中引用配置好的JNDI数据源

1  
7
8
9
Oracle DB Connection
10
oracleDataSource
11
javax.sql.DataSource
12
Container
13
14 15
16
17
MySQL DB Connection
18
mysqlDataSource
19
javax.sql.DataSource
20
Container
21
22 23
24
25
SQLServer DB Connection
26
sqlserverDataSource
27
javax.sql.DataSource
28
Container
29

  经过以上3个步骤,针对具体web项目配置的JNDI数据源就算是配置好了。具体的测试和上述测试全局JNDI数据源的方式是一样的!

转载于:https://www.cnblogs.com/wlzjdm/p/7853242.html

你可能感兴趣的文章
Oracle 通用分页存储过程
查看>>
《C++ Primer 4th》读书笔记 第4章-数组和指针
查看>>
手把手教你做关键词匹配项目(搜索引擎)---- 第二十二天
查看>>
Java类加载过程
查看>>
vue----封装长按指令
查看>>
ElasticSearch5.2.2 安装配置
查看>>
python之数据结构链表实现方式
查看>>
Co. - VMware - vSphere
查看>>
java02实验:方法
查看>>
Qt样式表之一:Qt样式表和盒子模型介绍
查看>>
自定义HTML标签属性
查看>>
USACO 5.3 Window Area
查看>>
_CRT_NONSTDC…与_CRT_SECURE…
查看>>
图标字体的使用(fontello.com)字体推荐及使用技巧
查看>>
Asp.Net_ 服务端向客户端写JavaScript脚本
查看>>
DirectX11--深入理解与使用2D纹理资源
查看>>
针对WebLogic Server 12.1.3版本打补丁
查看>>
全网备份
查看>>
在Mac OS上搭建本地服务器
查看>>
tyvj1938 最优战舰
查看>>