黑马程序员技术交流社区

标题: JavaEE的13种核心技术规范-JNDI(2) [打印本页]

作者: li745547    时间: 2018-3-25 13:13
标题: JavaEE的13种核心技术规范-JNDI(2)
<Context path="/demo" docBase="E:\webdemo" reloadable="true">   
            <Manager className="org.apache.catalina.session.PersistentManager">  
            debug=0 saveOnRestart="true"  
            maxActiveSession="-1" minIdleSwap="-1"  
            maxIdleSwap="-1" maxIdleBackup="-1"  
            <Store  
            className="org.apache.catalina.session.FileStore"  
            directory="d:\temp"/>  
            </Manager>  
            <Resource name="jdbc/mydata"  
            auth="Container"  
            type="javax.sql.DataSource"  
            maxActive="100"  
            maxIdle="30"  
            maxWait="10000"  
            username="root"     
            password="root"  
            driverClassName="com.mysql.jdbc.Driver"  
            url="jdbc:mysql://localhost:8080/mydata"/>  
        </Context>  


Tomcat 数据源  -- 原理、配置、使用
      在程序代码之中使用数据源可以提升操作性能的,这种性能提升依靠运行的操作原理

传统JDBC 使用过程中存在以下四个步骤:
     1、加载驱动程序
     2、进行数据库连接
     3、数据库操作
     4、数据库关闭
对于不同的用户只有操作不同,但是对于1、2、4三个步骤很明显是一个重复的操作
       如果开发中直接使用JDBC 操作的话,那么就回产生这种性能的问题,那么这么做才是最合适的呢?
     
JNDI属于命名及目录查找接口,主要的功能是用于进行查找的,查找对象
但是,现在的数据库的连接池是需要在Tomcat上完成配置的。
要修改server.xml 文件才可以起作用
[html] view plain copy

<Resource name="jdbc/mydata"  
auth="Container"  
type="javax.sql.DataSource"  
maxActive="100"  
maxIdle="30"  
maxWait="10000"  
username="root"     
password="root"  
driverClassName="com.mysql.jdbc.Driver"  
url="jdbc:mysql://localhost:8080/mydata"/>  



   此配置中有几个参数
name: 表示数据源的名称,也是要查找的名称
auth:表示由容器负责资源的连接
type:表示对象,数据源上每一个绑定的都是DataSource
maxActive: 表示最大连接数
minIdle:表示最小维持数量
maxWait:最大等待时间
对于连接的授权有两种: Container、Application(应用程序必须程序化的登录到资源管理器)

如果现在假设是oracle 数据库的话,则直接换启动程序即可
[html] view plain copy

<Resource name="jdbc/orcl"  
auth="Container"  
type="javax.sql.DataSource"  
maxActive="100"  
maxIdle="30"  
maxWait="10000"  
username="scott"     
password="tiger"  
driverClassName="oracle.jdbc.driver.OracleDriver"  
url="jdbc:oracle:thin:@localhost:1521:orcl"/>  
       但是现在使用tomcat 版本是6.0 ,所以要想让一个数据源起作用的话,还必须在web.xml 文件之中完成配置
<resource-ref>
    <res-ref-name>jdbc/mydata</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
</resource-ref>

查找数据源
   数据源的操作使用的是JNDI 方式进行查找的,所以如果要想使用数据源取得数据库连接的话,则必须按照如下的步骤进行
初始化名称查找上下文: Context ctx = new IntialContext();
通过名称查找DataSource 对象: DataSource ds = (DataSource)ctx.lookup(JNDI名称)
通过DataSource 取得一个数据库连接; Connection conn = ds.getConnection();
[html] view plain copy

<HTML>  
<HEAD>  
  <TITLE> New Document </TITLE>  
  
<BODY>  
<%  
    String DSNAME = "jdbc/mydata";   //名称  
    Context ctx = new InitialContext();  
    DataSource ds = (DataSource) ctx.lookup(DSNAME);  
    Connection conn = ds.getConnection();  //从连接池中取连接  
%>  
<%=conn%>  
<%  
    conn.close();  //表示将连接放回到池子中  
%>  
</BODY>  
</HTML>  

现在提示没有名称被发现
实际上对于这种资源的操作,本身是需要一个环境属性的支持的: java:comp/env, 但是Tomcat 服务器本身是免费,那么没有对这种属性提供支持,所以如果要想访问Tomcat中的名称服务的话,则肯定要在前面加上此属性,即,现在的名称是:java:comp/env/jdbc/mydata

以后程序中只认名字,而具体是哪个数据将由配置决定
当然: 如果现在使用的是DAO 开发的,DatabaseConnection.java类
[java] view plain copy

package com.demo;  
import java.sql.*;  
import javax.sql.*;  
import javax.naming.*;  
public class DatabaseConnection {  
    private static final String DSNAME = "java:comp/env/jdbc/mydat";  
    private Connection conn;  
    public DatabaseConnection() throws Exception{  
        Context ctx = new InitialContext();  
        DataSource ds = (DataSource) ctx.lookup(DSNAME);  
        this.conn = ds.getConnection();  
    }  
    public Connection getConnection() {  
        return this.conn;  
    }  
    public void close () throws Exception {  
        if(this.conn != null) {  
            try  
            {  
                this.conn.close();  
            }  
            catch (Exception e)  
            {  
                throw e;  
            }  
        }  
    }  
}  

可是有一点必须注意的是,现在得到数据库连接池是在Tomcat 上配置的,所以此程序在WEB下运行,而不能使用Application 程序运行
某一局部修改不影响其他变化
-----------------------------------------------
spring使用jndi数据源:
在使用 Tomcat服务器 + SpringFramework 进行JavaEE项目的开发部署的时候可以在Tomcat的配置文件中进行JDBC数据源的配置,具体步骤如下(这里省略了工程的建立步骤):

1) 添加如下代码到tomcat的conf目录下的server.xml中:
Xml代码  收藏代码
<Context>   
    <Resource name="jdbc/demoDB" auth="Container"   
    type="javax.sql.DataSource"  
    driverClassName="com.mysql.jdbc.Driver"  
    url="jdbc:mysql://localhost:3306/demo"  
    username="root"  
    password="123"  
    maxActive="50"  
    maxIdle="30"  
    maxWait="10000" />  
</Context>  
完成上述步骤数据源的连接池配置已经完成,但是为了提高项目的可移植性,最好将上述第二步的内容放入到工程的META-INF目录的context.xml中(这个文件需要自行建立):
Xml代码  收藏代码
<?xml version="1.0" encoding="UTF-8"?>  
<Context>  
      <Resource name="jdbc/demoDB" auth="Container"   
      type="javax.sql.DataSource"  
      driverClassName="com.mysql.jdbc.Driver"  
      url="jdbc:mysql://localhost:3306/demo"  
      username="root"  
      password="123"  
      maxActive="50"  
      maxIdle="30"  
      maxWait="10000" />  
</Context>  

2)在Spring的配置文件,如applicationContext.xml中配置配置如下内容:
Xml代码  收藏代码
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
<beans>  
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
        <property name="jndiName">  
            <value>java:comp/env/jdbc/demoDB</value>  
        </property>  
    </bean>  
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource">  
            <ref bean="dataSource" />  
        </property>  
    </bean>  
      
    <!-- 这里是自定义的数据库基础操作类 -->  
    <bean id="sqlBaseDAO" class="demo.BaseDAOImpl">  
        <property name="jdbcTemplate">  
            <ref bean="jdbcTemplate" />  
        </property>  
    </bean>  
</beans>




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2