数据库连接池与JNDI介绍与使用

本文介绍了数据库连接池的概念,强调其在初始化时创建并管理数据库连接。常见连接池如C3P0和Proxool。接着详细讲述了JNDI的原理,如何在Tomcat中配置数据源,并通过JNDI绑定到Hibernate实现数据库访问。最后,讨论了在无Hibernate项目中如何手动加载JNDI资源。
数据库连接池

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。

常见的数据库的连接池

C3P0和Proxool,这也是Hibernate 推荐使用的。

JNDI

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口。

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

这里写图片描述

从这里可以看出,JNDI做的事情是比数据库连接池,它管理数据源以及数据库连接池,更高级了。

在这里我们主要讲解如果Hibernate通过JNDI去绑定数据库的数据源。这里的服务器使用的是(Tomcat)。

首先我们在Tomcat 安装的目录找到conf下的Server.xml,在GlobalNamingResources标签下,添加如下内容:

<Resource 
         name="jdbc/mysql"
         auth="Container" //:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效
         type="javax.sql.DataSource"
         maxActive="100" //表示一个数据库在此服务器上所能打开的最大连接数
         maxIdle="30" //表示一个数据库在此服务器上维持的最小连接数
         maxWait="10000"//最大等待时间
         username="root" 
         password="123456"
         driverClassName="com.mysql.jdbc.Driver"
         url="jdbc:mysql://localhost:3306/test"/>

这里的数据源是以mysql为例,其他数据库的,自行配置。在这里配置是全局配置。

还在上面conf目录下,找到Context.xml,添加如下内容:

    <ResourceLink 
            global="jdbc/mysql" 
            name="jdbc/mysql" 
            auth="Container" 
            type="javax.sql.DataSource"/>

可以看出这里的作用,是用你定义的name和全局的name映射起来,两种的名字,最好一致,比较省事。

经过上面两步的配置,你需要重新启动Tomcat,让它生效。

下面,我们在hibernate进行配置,在原先的hibernate.cfg.xml,
就可以省去一大堆数据库的配置了。只需要添加如下属性,即可获取mysql的数据源。

<property name="hibernate.connection.datasource">java:comp/env/jdbc/mysql</property>

然后你在Hibernate操作数据库,都可以了,因为有了数据源。

整个流程,我们需要注意:因为我们数据源是配置在web服务器上,所以在运行服务器,才可以获取数据源,不可以在main中测试,会报错的。

JNDI 在普通项目中的使用

之前所有的配置还是一样,只是如果项目没有hibernate支持,就不像直接在hibernate.cfg.xml配置就好,而是需要手动写代码去加载资源。

    try {
          Context context = newInitialContext();
           DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/mysql");
          conn = (Connection) ds.getConnection();
    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

学习参考
学习参考
学习参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值