在TOMCAT5.0下的JNDI配置记实
-------开发环境:TOMCAT5.0+MS SQL SERVER2000+JDK1.4
一.什么是JNDI:
Java Naming and Directory Interface(名字与目录服务).如果你自己建过数据库连接池,就会深刻体会到一个优秀的专门用来处理这个问题的方案的价值所在了。JNDI是 J2EE中一个很重要的标准,通常我们是在EJB编程中用到。通过JNDI可以实现池操作。
二.配置前环境要求:
1.安装有JDK1.4、TOMCAT5.0、MS SQL SERVER2000
2.安装 Microsoft SQL Server 2000 Driver for JDBC (该项的配置过程是:将其lib下的msutil.jar、mssqlserver.jar和msbase.jar文件放到 tomcat/common/lib下,然后设置相应的classpath即可)
3.有jtds.jar,并将它放在$TOMCAT5.0_HOME/common/lib目录下(只能是这里)。使用它是因为Microsoft公司的Java SQL Server驱动程序不支持二次查询,目前使用的是jtds-0.6.jar
4.所需要的jar文件:commons-pool.jar, commons-dbcp.jar(后面介绍如何用)
三.JNDI配置过程:
1.启动Tomcat,打开IE(在地址栏内输入http://localhost:8080/admin )进入Tomcat的管理界面 ;
2.进入Data Sources 项 ,在右上角的下拉菜单中选择Create New Data Source ,在其下边的输入框中输入需要的配置信息:
JNDI Name:jdbc/XXX(XXX自己命名,jdbc/XXX为建立的jndi实体名称)
Data Source URL:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=ObjectDataBaseName(目标数据源设置)
JDBC Driver Class: com.microsoft.jdbc.sqlserver.SQLServerDriver 即使用的数据库驱动程序
User Name: 连接数据库的用户名
Password: 数据库密码
Max. Active Connections: 最大连接数
Max. Idle Connections: 是最大的空闲连接数
Max. Wait for Connection: 最大等待连接数
3.如果要部署的是个WEB应用程序,则将该应用程序放在 $TOMCAT_HOME/webapps目录下,有两种方式可以引用我们所配置的JNDI数据源
(1)[这种方法可以进行多个项目的建设和发布]
可以在TOMCAT_HOME/conf/Catalina/localhost下新建XXX.xml文件,XXX为所发布的WEB应用程序的名字,如我所发布的WEB应用程序是JndiTest,则.xml文件命名为JndiTest.xml,该文件内容为:
<?xml version='1.0' encoding='utf-8'?>
<Context debug="1" docBase="$Tomcat 5.0_Home/webapps/JndiTest" path="/JndiTest" reloadable="true" workDir="work\Catalina\localhost\JndiTest">
<Resource name="jdbc/test" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>password</name>
<value>DataBasePassword</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>4</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=ObjectDataBaseName</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter>
<name>username</name>
<value>DataBaseUserName</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>2</value>
</parameter>
</ResourceParams>
</Context>
(2)上面的方法只能实现一个项目,建议熟练了以后用(1)中的方法
为了避免每个WEB应用程序都创建XXX.xml文件,可以修改TOMCAT_HOME/conf下的server.xml文件,修改如下:
在<Host></Host>之间加入:
<Context path="/JndiTest" docBase="$Tomcat 5.0_Home/webapps/JndiTest" debug="1" reloadable="true">
<Resource name="jdbc/test" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=ObjectDataBaseName</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>4</value>
</parameter>
<parameter>
<name>password</name>
<value>DataBasePassword</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>2</value>
</parameter>
<parameter>
<name>username</name>
<value>DataBaseUserName</value>
</parameter>
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
</ResourceParams>
</Context>
(3)在相应的web.xml里加入
<resource-ref>
<description>SqlServer Datasource example</description>
<res-ref-name>jdbc/SqlServerDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
四.测试:
以上工作都完成后,便可进行测试。首先用普通的jsp页面测试不进行数据库操作时的情况,无误后进行数据库操作测试。
(1)新建一数据源test,含表T_test,并存如数据
(2)在项目的lib文件下部署commons-pool.jar, commons-dbcp.jar
(3)如下为jsp测试页面代码
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<html>
<body>
<% Context ctx = new InitialContext();
Connection conn=null;
ctx = new InitialContext();
DataSource ds =(DataSource)ctx.lookup("java:comp/env/jdbc/test");
conn = ds.getConnection();
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from T_Test";
ResultSet rs=stmt.executeQuery(sql);
%>
<% while(rs.next()) {
out.println(rs.getString(1));
out.println(rs.getString(2));
out.println(rs.getString(3));
}
%>
<% out.print("数据库操作成功!");
rs.close();
stmt.close();
conn.close();
%>
</body>
</html>