.什么是JDNI
1.java Naming and Directory Interface,java命名和目录接口
2.是一组在Java应用中访问命名和目录服务的API
3.通过名称将资源与服务进行关联
这些都是一些官方的解释,一时半会也很那理解透彻,下面是我自己对JDNI的理解
JNDI是用来干什么的?说通俗一点它就是一个接口,连接数据库的一个接口
1.在没有JDNI时的用法:
我现在目前用的数据库是oracle,对于一个程序员来说为了连接数据库的前提条件我们先得到它的DRIVERCLASS来加载驱动,URL,UNAME,UPASS来创建数据库连接
private static final String DRIVERCLASS="oracle.jdbc.OracleDriver";
private static final String URL="jdbc:oracle:thin:@localhost:1522:ORCL";
private static final String UNAME="scott";
private static final String UPASS="1234";
//加载驱动
static{
try {
Class.forName(DRIVERCLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建数据库连接
public static Connection getConn(){
Connection conn=null;
try {
conn = DriverManager.getConnection(URL, UNAME, UPASS);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//关闭连接
public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){
try {
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(ps!=null){
ps.close();
}
if(rs!=null){
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void closeAll(Connection conn,PreparedStatement ps){
try {
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(ps!=null){
ps.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
然后我又在网上查找了关于如果我们没有运用JNDI时会遇到的问题
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;
解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。
2.运用JDNI方法之后
配置的内容可以从Tomcat官网中找到
在使用JDNI之前我们现需要配置文件,数据库连接池实现步骤
<1>copy相对应的数据库jar到Tomcat/lib
<2>添加以下配置信息到conf/context.xml
//配置数据源( MySQL)
更改掉,name,username,password,driverClassName,url
<Context ...>
...
<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="dbusername"
password="dbpassword"
driverClassName="org.hsql.jdbcDriver"
url="jdbc:HypersonicSQL:database"
maxTotal="8"
maxIdle="4"/>
...
</Context>
//配置数据源(ORACLE)
<Resource name="jdbc/news" 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"
/>
//引用数据源
配置到web.xml文件中
<description>可写可不写</description>
<res-ref-name>这个数据源名字要与配置数据源中的name要一致</res-ref-name>
<resource-ref>
<description>
Resource reference to a factory for java.sql.Connection
instances that may be used for talking to a particular
database that is configured in the <Context>
configuration for the web application.
</description>
<res-ref-name>
jdbc/EmployeeDB
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
配置完后我们可以在jsp页面上测试是否配置成功
<%
Context context=new InitialContext();
Context contextjava=(Context)context.lookup("java:/comp/env");
DataSource dataSource=(DataSource)contextjava.lookup("bean/Porter");
Connection conn=dataSource.getConnection();
out.print(conn);
%>
若出现如下的代码则配置成功
然后我们再去引用我们的数据源
public static Connection getConn(){
try {
Context context=new InitialContext();
Context contextjava=(Context)context.lookup("java:comp/env");
DataSource dataSource=(DataSource)contextjava.lookup("jdbc/zking160628DB");
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void getClose(Connection conn,PreparedStatement ps,ResultSet rs){
try {
if(conn!=null&&!conn.isClosed()){
conn.close();
}
if(ps!=null){
ps.close();
}
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}