一、JNDI简介
1.什么是JNDI
- Java Naming and Directory Interface,Java命名和目录接口
- 通过名称将资源与服务进行关联
2.JNDI的作用与优点
- 在应用与Java对象或资源之间建立松耦合的逻辑关联,简化应用对于资源的配置及维护工作
- 可以在更大范围、不同应用之间共享资源
3.JNDI的简单应用
---如何实现在Tomcat中发布一条信息供所有的Web应用程序使用?
1)发布信息:修改Tomcat\conf\context.xml文件
<Context>
<!--其中name="tjndi" 为JNDI查找的名称-->
<Environment name="tjndi" value="hello JNDI" type="java.lang.String" />
</Context>
2)获取资源:使用lookup()进行查找
// javax.naming.Context提供了查找JNDI 的接口
Context ctx = new InitialContext(); //初始化Context对象
// java:comp/env/为前缀
String testjndi = (String) ctx.lookup("java:comp/env/tjndi");//调用lookup()方法
out.print("JNDI: " + testjndi);
二、为什么使用连接池
JDBC连接数据库的方式是一种比较传统的连接方式,这种连接方式在执行过程中,需要经常与数据库建立连接,并且在使用后再关闭连接,释放资源。可想而知,频繁的连接和释放操作必然要耗费很多系统资源,而且容易引发异常,因而需要有一种新的技术来弥补它的不足,这就是连接池(Connection Pool)技术。
三、连接池技术原理
四、DataSource与连接池
1.javax.sql.DataSource接口的实现类
- 负责管理与数据库的连接
- 以连接池的形式对数据库连接进行管理
2.获取DataSource实例
- Tomcat支持将DataSource实现发布为JNDI资源
- Web应用通过JNDI获得DataSource引用
五、访问数据源
1.配置Tomcat的conf文件夹下的context.xml文件(ppt写的这种)
<Context>
<Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="newsu"
password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/newsmanagersystem?
useUnicode=true&characterEncoding=utf-8" />
</Context>
2.配置Tomcat的conf文件夹下的server.xml文件(老师讲的这种)
<!--配置了mysql数据源-->
<Resource name="jdbc/mysql" auth="Container"
type="javax.sql.DataSource"
username="root"
passward="123"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql:///newsmanagersystem?useUnicode=true;characterEncoding=utf8;"
maxActive="100"/>
属性名称 |
说明 |
name |
指定Resource的JNDI名称 |
auth |
指定管理Resource的Manager |
type |
指定Resource所属的Java类 |
maxActive |
指定连接池中处于活动状态的数据库连接的最大数目 |
maxIdle |
指定连接池中处于空闲状态的数据库连接的最大数目 |
maxWait |
指定连接池中的连接处于空闲的最长时间 |
auth指定管理Resource的Manager(Container:由容器创建和管理Application:由Web应用创建和管理) maxWait指定连接池中的连接处于空闲的最长时间,超过这个时间会抛出异常,取值为-1,表示可以无限期等待。记住每个属性含义即可,一般都是使用模板,修改属性值即可
2.
添加数据库驱动文件
- 把数据库驱动jar文件,加入到Tomcat的lib中
配置应用程序的web.xml文件
- 在web.xml中配置<resource-ref>
<resource-ref>
<description>用于说明数据源</description>//可不写
<!--数据源名称 在Tomcat的server.xml中配置的-->
<res-ref-name>jdbc/news</res-ref-name>//指定JNDI的名字,与<Resource>元素中的name一致
<res-type>javax.sql.DataSource</res-type>//指定引用资源的类名,与<Resource>元素中的type一致
<res-auth>Container</res-auth>//指定管理所引用资源的Manager与<Resource>元素中的auth一致
</resource-ref>
在BaseDao.java文件中编写代码
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class BaseDao {
public Connection getConnection () {
Connection conn = null;
try { //获取与逻辑名相关联的数据源对象
Context ctx = new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/news");
conn = ds.getConnection();
} catch (SQLException exception) {
exception.printStackTrace();
} catch (NamingException namingException)
namingException.printStackTrace();
}
return conn;
}
}