一、简介

  • 在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可。在J2EE服务器上保存着一个数据库的多个连接。每一个连接通过DataSource可以找到。DataSource被绑定在了JNDI树上(为每一个DataSource提供一个名字)客户端通过名称找到在JNDI树上绑定的DataSource,再由DataSource找到一个连接。如下图所示:

  • 如果要想使用数据源的配置,则必须配置虚拟目录,因为此配置是在虚拟目录之上起作用的。需要注意的是,如果要想完成以上的功能,在Tomcat服务器上一定要有各个数据库的驱动程序。

二、连接池

常用的连接池:Tomcat-dbcp/C3P0/Proxool/阿里的durid

三、局部连接池第一种配置方法

    3.1    连接池必须在虚拟目录上,所以需要以下操作

  3.2  在server.xml中配置虚拟目录和连接池。

    <Context path="/JNDITest" docBase="D:\workspace\JNDITest\WebContent"
reloadable="true"> <Resource name="jdbc/mysql" type="javax.sql.DataSource"
username="root" password=""
url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"
driverClassName="com.mysql.jdbc.Driver" maxActive="50" maxIdle="20"
maxWait="5000" />
</Context>
  •   注意: mysql数据库的url记得加上serverTimezone=UTC 否则会报 Cannot create PoolableConnectionFactory 错误。

  3.3  测试

index.jsp

<a href="<%=path%>/servlet/TestJNDI">测试JNDI</a>
TestJNDI.java
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
// 1、初始化名称查找上下文
Context context = new InitialContext();
// 2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名
DataSource dateSource = (DataSource) context.lookup("java:comp/env/jdbc/mysql");
Connection conn = dateSource.getConnection(); Statement stat = conn.createStatement();
int res = stat.executeUpdate("insert into users values(5,'test_user','test_password') "); if (res > 0) { System.out.println("新增成功");
} else {
System.out.println("新增失败");
} } catch (Exception e) {
e.printStackTrace();
} }

  3.4  结果

  • 缺陷:该配置方法的缺陷是我们需要修改tomcat的server.xml,但在开发环境中一般该server.xml是无法修改的,所以一般都用第二种配置方法。

四、 局部连接池第二种配置方法(最常用):在工程中配置

   4.1  在WebContent目录下,新建一个文件夹 META-INF(eclipse/myeclipse一般自动生成,就不需要新建)

  4.2  在META-INF目录下新建一个文件 context.xml,配置连接池。

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true"> <Resource name="jdbc/mysql" type="javax.sql.DataSource"
username="root" password=""
url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"
driverClassName="com.mysql.jdbc.Driver" maxActive="50" maxIdle="20"
maxWait="5000" />
</Context>
  • 其中,path和docBase属性就不需要配了,因为该文件就是在本工程目录下。

  4.3  将工程部署到Tomcat中运行,并测试

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
// 1、初始化名称查找上下文
Context context = new InitialContext();
// 2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名
DataSource dateSource = (DataSource) context.lookup("java:comp/env/jdbc/mysql");
Connection conn = dateSource.getConnection(); Statement stat = conn.createStatement();
int res = stat.executeUpdate("insert into users values(6,'test_user2','test_password2') "); if (res > 0) { System.out.println("新增成功");
} else {
System.out.println("新增失败");
} } catch (Exception e) {
e.printStackTrace();
} }

  4.4  结果

五、JNDI缺陷

  • 缺陷:jndi只能运行于WEB环境中,因为获取是的容器的环境。不能运行在main方法/SE环境。
  • 解决方法:将Tomcat-dbcp/C3P0/Proxool/阿里的durid产生连接池的方式,用SE的代码来产生。

  5.1:将连接池的jar拷到工程中。

  

  5.2:改造jdbc获取连接的方法。

package servlet;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DBUtil {
private static final String DRIVER="com.mysql.jdbc.Driver";
private static final String USER="root";
private static final String PASSWD="";
private static final String URL="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
private static ComboPooledDataSource dataSource=null;
static{
try {
Class.forName(DRIVER); Context context=new InitialContext(); dataSource=new ComboPooledDataSource();
dataSource.setMaxPoolSize(50);
dataSource.setInitialPoolSize(20);
dataSource.setJdbcUrl(URL);
dataSource.setDriverClass(DRIVER);
dataSource.setUser(USER);
dataSource.setPassword(PASSWD); } catch (Exception e) { throw new RuntimeException("驱动包加载故障");
} } public static Connection getConn(){
Connection conn=null;
try {
conn= dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
} return conn;
} public static void main(String[] args) {
for(int i=0;i<100;i++){ System.out.println(DBUtil.getConn()+"\t "+i);
}
}
}

  5.3:结果

(一)JNDI基础的更多相关文章

  1. Mybatis 框架

    在之前的内容中,我写了Java的基础知识.Java Web的相关知识.有这些内容就可以编写各种各样丰富的程序.但是如果纯粹手写所有代码,工作量仍然很大.为了简化开发,隐藏一些不必要的细节,专心处理业务 ...

  2. Java基础学习总结(26)——JNDI入门简介

    JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有 ...

  3. JNDI注入基础

    JNDI注入基础 一.简介 JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务 ...

  4. Java基础之Calendar类、JNDI之XML

     一.Calendar类 从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现.在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要 ...

  5. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  6. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  7. JavaEE开发基础

    1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, Enterprise E ...

  8. Java学习笔记之JNDI(六)

    JNDI 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的 ...

  9. java必备基础知识点

    Java基础 1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机.冰箱等 2. 简单写出 ...

随机推荐

  1. Linux | Vim使用

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...

  2. ST (Sparse Table:稀疏表)算法

    1541:[例 1]数列区间最大值 时间限制: 1000 ms         内存限制: 524288 KB提交数: 600     通过数: 207 [题目描述] 输入一串数字,给你 MM 个询问 ...

  3. GIS 空间分析案例分析-错误排除经验总结

    GIS 空间分析案例分析-错误排除经验总结 商务科技合作:向日葵,135—4855__4328,xiexiaokui#qq.com 目录:问题发现,问题分析,解决方法,结果 1. problem di ...

  4. grub下如何指定哪个分区为根文件系统?

    答: 使用root命令,如: grub> set root=(hd0,msdos1)

  5. Flutter常用命令和mac电脑常用命令

    0.  flutter create example_demo  新建flutter项目 1.flutter packages get  安装新增的包 2.flutter run 运行flutter项 ...

  6. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_01-Eureka注册中心-Eureka介绍

    1 Eureka注册中心 1.1 需求分析 在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中 心来管理微服务信息. 为什么 要用注册中心 ...

  7. 浅谈-对modbus的理解

    浅谈-对modbus的理解 一.简介 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准.1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP ...

  8. (十六)toString()的用法

    每一个非基本类型的对象都有一个toString()方法,而且当编译器需要一个String而你却只有一个对象时候,该方法便会被调用. public class te { public String to ...

  9. CYLTabBarController的简单使用

    #pragma mark- 登录成功跳转至主页 -(void)jumpToMainVC { [UIApplication sharedApplication].statusBarStyle = UIS ...

  10. Laravel 别名Redis 与 Redis 扩展冲突

    use Redis; //通过别名引用会报错 今天尝试使用了 Laravel 的 redis 结果报了如下错误. Non-static method Redis::xxx() cannot be ca ...