JNDI:JNDI是 Java命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一
把路径名称与一个java对象绑定. 我们可以通过路径名称获得java对象的技术,就是jndi;(通过路径获取对象,把一个对象交给tomcat来进行管理,给此对象一个路径,在项目里通过路径获取对象)
Jndi、tomcat与dbcp的结合使用
JNDI的使用:1)在容器中配置数据源 2)在程序中引用数据源。
以连接数据库为例
没有JNDI的做法存在的问题:
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;
解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。
首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。
JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。
JNDI的扩展:JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有系统外部的资源的引用,都可以通过JNDI定义和引用。
J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。
1)把连接池的jar包放到tomcat的lib目录下。
2)在conf目录下,找到context.xml文件
Name表示对象的名字,jdbc/datasource,auth表示作者,用户名,密码,驱动类名,url。
代码如下:
<Resource name="jdbc/datasource" auth="Container"
type="javax.sql.DataSource" username="root" password="0000"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"
maxActive="8" maxIdle="4"/>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Context initCtx = null;
try {
//初始化容器对象
initCtx = new InitialContext();
//最后的路径要和配置文件中保持一致
//comp/env表示环境命名上下文(environment naming context(ENC))
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/datasource");
Connection conn = ds.getConnection();
System.out.println(conn+"test");
} catch (Exception e) {
e.printStackTrace();
}
}
可能会出现的问题:
实验Tomcat的DBCP数据源的时候发生com.MySQL.jdbc.Connection.isValid(I)Z错误。
原因:JDBC驱动过旧(下载新的驱动)。
解决方法:更新驱动 放在tomcat的lib目录下