`

Jndi Tomcat 配置

    博客分类:
  • Jndi
阅读更多

Tomcat 5.5(以上版本)配置JNDI数据源

配置数据源,总的来说有两种思路,思路一是直接在<Context>中配置局部数据源,思路二是先配置全局数据源,然后再在<Context>应用中链接到全局数据源,又因为Tomcat中<Context>位置多样,具体我分为如下几种方法:

方法1、直接在<Context>中配置局部数据源,tomcat中%tomcat_home%\conf\ context.xml中的<Context>中添加数据源。即将第2步中的数据直接添加到<Context>节点下。已通过验证。

方法2、第2步 + 第6步,测试通过。

方法3、方法4、先配置全局数据源,然后再在<Context>应用中链接到全局数据源,在server.xml中的<GlobalNamingResources>元素中配置数据源(数据源配置见上文)成全局数据源,然后在<Context>元素链接到该资源。另外,<Context>位置可有多个,那么在<Context>元素链接到全局数据源的位置时,<Context>的位置可有两个如下:
实现方式有:方法3-------第2步 + 第3步,联合实现,测试通过
    方法4---------第2步 + 第7步,联合实现,测试通过

方法5:(直接配置的类型,这种方式最简单)
就是第8步的操作即可,验证通过

1、(必不可少)先将JDBC驱动加入到tomcat6/lib目录下
如果直接用JDBC访问数据库,可以把JDBC驱动程序拷贝到Web应用的WEB-INF/lib目录或者Tomcat安装目录下的common/lib目录下。
  
  如果通过数据源访问数据库,由于数据源由Servlet容器创建并维护,所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下,确保Servlet容器能够访问驱动程序。


2、在tomcat的conf/server.xml中的<GlobalNamingResources>元素中添加如下内容:
<!—连接sqlserver -->
<Resource
    name="jdbc/sqlservertest"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="45"
    username="sa"
    maxWait="180"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    password="123456"
    url="jdbc:jtds:sqlserver://localhost:1433/test" 
    removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>

<!—连接mysql -->
<Resource name="jdbc/mysql"   
           auth="Container"
           type="javax.sql.DataSource"   
           driverClassName="com.mysql.jdbc.Driver"   
           url="jdbc:mysql://localhost:3306/wxl" 
           username="root"   
           password="root"   
           maxActive="100"   
           maxIdle="30"   
           maxWait="10000" />
以上配置了两个全局数据源,一个叫jdbc/sqlservertest,是SQLServer2000的,一个叫:jdbc/mysql,是连接mysql的

参数说明:
driveClassName:JDBC驱动类的完整的名称; 
maxActive:同时能够从连接池中被分配的可用实例的最大数; 
maxIdle:可以同时闲置在连接池中的连接的最大数; 
maxWait:最大超时时间,以毫秒计; 
password:用户密码; 
url:到JDBC的URL连接; 
user:用户名称; 
validationQuery:用来查询池中空闲的连接。

3、在tomcat的conf/ context.xml中的<Context>元素中添加如下内容:
<ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />

4、补充一步(可有可无)
在应用发布目录下\web-inf\web.xml文件中配置该数据源的引用<resource-ref>元素(注意位置,一般放在<web-app>根元素中最后面,详细参考dtd文件)。我在如上所示环境实际测试时发现,此文件可有可无。(确实是这样的)有的文章说配置了可能会更稳定,未及考证。如下:
<resource-ref>
   <description>DB Connection</description>
   <res-ref-name>jdbc/mysql</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
</resource-ref>
这一步的目的就是告诉tomcat如何连接数据库


5、获得连接
<%@ page language="java" import="java.util.*,java.sql.Connection,javax.sql.DataSource, javax.naming.InitialContext" pageEncoding="utf-8"%>

<html>
<head>
<%
   InitialContext ctx = new InitialContext();
   String strLookup = "java:comp/env/jdbc/mysql";
   DataSource ds =(DataSource) ctx.lookup(strLookup);
   Connection con = ds.getConnection();
   if (con != null){
     System.out.print("success");
   }else{
      System.out.print("failure");
   }
%>

<body>
    搞得我好辛苦啊 <br>
</body>
</html>
补充一个常见错误:
上述代码在J2EE服务器环境下工作得很好,但是在main()中就会报错:javax.naming.NoInitialContextException:

之所以有NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中。
所以可以通过以下方法解决:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,"t3://localhost:7001");
InitialContext ctx = new InitialContext(env);


System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:3306/wxl");
System.setProperty(Context.SECURITY_PRINCIPAL, "root");
System.setProperty(Context.SECURITY_CREDENTIALS, "root");

以上代码建议改为在配置文件中配置
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=rmi://localhost:3306/test
java.naming.security.principal=root #用户名
java.naming.security.credentials=root #密码
这里要正常运行,肯定要导入weblogic.jndi.WLInitialContextFactory相关的包了。

然后将做个web工程发布到tomcat下;我用了两种方式发布:一种是war包的方式,一种是在server.xml中添加一个Context;
下面分别说说两种发布方式的区别:
6、war包方式:
如果要用war包方式发布web应用程序,又要使用JNDI数据源的话,要在你的web工程的META-INF文件夹下新建context.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource"/>
</Context>
global:就是tomcat的server.xml中配置的全局数据源名称。
name:就是你的web项目中要用的那个那个数据源的名称:也就是jsp中写的那个mysqltest2名称;


7、在server.xml中添加context的方式:
直接在server.xml中的<Host></Host>中添加如下内容:

<Context path="/Pool" docBase="E:/apache-tomcat-6.0.16/webapps/Pool" reloadable="true">
          <ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />
     </Context>
其中:path为应用名
     docBase 为应用路径

8、只需在tomcat_home\webapps\myapps\META-INF\context.xml中增加:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<Resource name="jdbc/mysql"   
           auth="Container"
           type="javax.sql.DataSource"   
           driverClassName="com.mysql.jdbc.Driver"   
           url="jdbc:mysql://localhost:3306/wxl" 
           username="root"   
           password="root"   
           maxActive="100"   
           maxIdle="30"   
           maxWait="10000" />
</Context>

说明:这种配置需要告诉tomcat resource的内容,resource应用于什么地方


//========================================================
常见错误:
1,Name jdbc is not bound in this Context
2,Cannot create JDBC driver of class ” for connect URL ‘null’ conf localhost
原因:
大多数是因为配置了全局的resource,但没有link造成的。
解决:
加入link就行了。
分析:
看到上边这么多方法,是否感觉眼花缭乱,其实不要死记配置,按照原理分析一下就好了。
你需要的是告诉tomcat哪个应用如何连接数据库。
类型一的方式对应一个应用单独使用这个配置的情况
就是直接告诉tomcat”应用名” “连接数据库需要的参数”

类型二的方式对应多个应用共享一个配置的情况
这样先配置server.xml告诉tomcat全局范围的”连接数据库需要的参数”
然后映射,映射的时候
1,如果不知道”app name(应用名)”就只需要通过文件名来传递这个信息
2,如果”app name”都知道就只需要加入映射的内容
3,如果要配置成全局公用的,就不需要”app name”,本身放在tomcat的context.xml中
最后再次提醒一下:所有的配置必须放在<context></context>之间

 

<!--EndFragment-->

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics