连接池数据源JNDI三者间的关系及用法

Posted Keep Moving

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接池数据源JNDI三者间的关系及用法相关的知识,希望对你有一定的参考价值。

连接池:
连接池是由容器(比如Tomcat)提供的,用来管理池中的连接对象。
连接池自动分配连接对象并对闲置的连接进行回收。
连接池中的连接对象是由数据源(DataSource)创建的。
连接池(Connection Pool)用来管理连接(Connection)对象。

数据源:
数据源(DataSource)用来连接数据库,创建连接(Connection)对象。
 java.sql.DataSource接口负责建立与数据库的连接
 由Tomcat提供,将连接保存在连接池中。


JNDI(Java Naming and Directory Interface,Java命名和目录接口):
在程序中使用JNDI获取数据源。


通过数据源创建的连接对象被统一的放入到连接池中进行管理。


搞清楚三者的关系,然后进行下面的配置 : )

 

 

连接池的配置:

C3P0连接池在Spring的配置文件application.xml的配置:

<!-- 配置C3P0连接池: -->
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${jdbc.driver}"/>
  <property name="jdbcUrl" value="${jdbc.url}"/>
  <property name="user" value="${jdbc.user}"/>
  <property name="password" value="${jdbc.password}"/>
 </bean>

 

 


数据源的配置与使用数据源的方法:

1、配置Tomcat的conf/context.xml
 <Resource name="jdbc/news" 
              auth="Container"  type="javax.sql.DataSource"  maxActive="100" 
              maxIdle="30" maxWait="10000" username="root"  password="Admin" 
              driverClassName="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://127.0.0.1:3306/news"/>
  name=指定Resource的JNDI名称
  auth=指定管理Resource的Manager(Container由容器创建和管理,Application由Web应用创建和管理) 
  type=指定Resource的java类
  maxActive=指定连接池中处于活动状态的数据库连接的最大数量
  maxIdle=指定连接池中处于空闲状态的数据库的最大数量
  maxWait=指定连接池中连接处于空闲的最长时间,超过这个时间会提示异常,取值为-1,表示可以无限期等待,单位为毫秒(ms)
 这里不要忘记:还需要将数据库的驱动jar包添加到,Tomcat安装目录下的lib文件夹中。

2、使用JNDI获取连接对象
 lookup(java:comp/env/数据源名称");
 //java:comp/env/这是Java的语法要求,必须写上。
 //这里的数据源名称就是上面的jdbc/news,这个news是项目名。
 

 

3.编写代码获取数据源

  // 获取数据库连接
  public Connection getConnection2() {
   try {
    //初始化上下文
    Context cxt=new InitialContext();
    //获取与逻辑名相关联的数据源对象
    DataSource ds=(DataSource)cxt.lookup("java:comp/env/jdbc/news");
    conn=ds.getConnection();
   } catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return conn;
  }

 

还有一点要注意:测试连接是否成功,需要在jsp页面输出connection,而不是在java类中Run As,应为数据源配置在Tomcat中需要把Web项目放入Tomcat容器中运行。jsp页面代码如下:

示例:

 

<%
 BaseDao baseDao=new BaseDao();
 Connection connection=baseDao.getConnection2();

 %>

<%=connection %>

 

 

 在Tomcat中的配置

配置在:context.xml文件内


F:\apache-tomcat-7.0.68-windows-x64\apache-tomcat-7.0.68\conf\context.xml


---------mySQL
<Resource name="jdbc/news"
auth="Container" type="javax.sql.DataSource"
maxActive="100"
maxIdle="30" maxWait="10000" username="root"
password="Admin001"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/news"/>

 


----------Oracle
<Resource name="jdbc/orcl"
auth="Container" type="javax.sql.DataSource"
maxActive="100"
maxIdle="30" maxWait="10000" username="wuyong"
password="Admin001"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl"/>

 


使用JNDI获取连接对象 
java:comp/env/jdbc/news

这段为固定写法
java:comp/env/    

以上是关于连接池数据源JNDI三者间的关系及用法的主要内容,如果未能解决你的问题,请参考以下文章

使用JNDI连接数据库连接池问题,救命啊!!!!

JNDI与连接池

连接池还是数据源?我应该把哪个放在JNDI中?

主流Java语言数据库连接池比较及前瞻

JDBC数据源 使用JNDI连接池实现数据库的连接

5. JDBC之数据库连接池——Part2