java - 在 Tomcat 中加载 JNDI 资源时出现 ClassNotFoundException

标签 java tomcat jndi

我目前正在尝试使用 Tomcat/JNDI 读取 MS SQL Server 数据库表。如果我手动将数据源硬编码到我的 Java 源代码中,我可以毫无问题地从表中读取数据,但是当我尝试使用 JNDI 加载数据源时,我得到一个 ClassNotFoundException:

java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerConnectionPoolDataSource
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1420)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
TestServlet.doGet(TestServlet.java:53)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我不希望看到这个,因为我将 Microsoft 的 JDBC 驱动程序 (sqljdbc4.jar) 存储在 Tomcat 的 lib 目录(而不是应用程序的 WEB-INF/lib)中,并且当我将 DataSource 硬编码到我的 Java 中时它工作正常源代码。有没有人知道为什么会发生这种情况,或者知道在使用 JNDI 资源时必须指定什么才能让 Tomcat 将 lib 目录添加到类路径?

上下文.xml:

<Context>

<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->

<!-- Uncomment this to enable Comet connection tacking (provides events
     on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->

<Resource name="jdbc/dspr" auth="Container" type="javax.sql.DataSource"
    username="<USERNAME OMITTED>"
    password="<PASSWORD OMITTED>"
    driverClassName="com.microsoft.jdbc.sqlserver.SQLServerConnectionPoolDataSource"
    url="<URL OMITTED>"
    validationQuery="select 1"
    />
</Context>

TestServlet.java(doPost() 代码):

PrintWriter out = response.getWriter();
    try {
        // Servlet fails with a ClassNotFoundException when this block is
        //used rather than the block below
        InitialContext initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:/comp/env");
        DataSource ds = (DataSource) envContext.lookup("jdbc/dspr");

        // =========
        // Servlet works when this is uncommented and the above block is commented out
        //SQLServerConnectionPoolDataSource ds = new SQLServerConnectionPoolDataSource();
        //ds.setURL("<URL OMITTED>");
        //ds.setUser("<DATABASE USER OMITTED>");
        //ds.setPassword("<DATABASE PASSWORD OMITTED>");
        // =========

        Connection c = ds.getConnection();
        Statement s = c.createStatement();
        boolean good = s.execute("select * from DS.test_table1");
        System.out.println("** QUERY GOOD? " + good);
        ResultSet rs = s.getResultSet();
        while (rs.next()) {
            String col = rs.getString("col1");
            String val = rs.getString("val1");
            System.out.println(col + " | " + val);
        }
        c.close();
    } catch (NamingException e) {
        throw new ServletException(e);
    } catch (SQLException e) {
        throw new ServletException(e);
    }
    out.write("hello");
    out.close();

最佳答案

Tomcat 包括 Apache DBCPApache Pool , 所以你只需要提供驱动程序类名。

<Resource name="jdbc/dspr" auth="Container" type="javax.sql.DataSource"
      maxActive="100" maxIdle="30" maxWait="10000"
      username="<USERNAME OMITTED>"
      password="<PASSWORD OMITTED>"
      driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
      url="<URL OMITTED>"  />

请参阅 Configure Tomcat 6 DataSource using Sql Server 2005 中的示例.下面呢?您可以将它注入(inject)到 servlet 中,而不是寻找资源。参见 Connect to Datasource without resource-ref in web.xml

关于java - 在 Tomcat 中加载 JNDI 资源时出现 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277705/

相关文章:

java - Box2d 中动态主体为空

jsp - 为什么每次编辑一个Servlet类都要重启Tomcat

java - ldapsearch 返回namingContexts 但 JNDI 不返回

java - 在没有 resource-ref 定义的情况下查找 jndi 资源

spring - 如何为 tomcat 6 及其部署的 webapps 正确配置 JNDI?

java - 锁屏显示 : Unable to load X11 when using JNA to lock display

java - 使用 Spring MVC 将文件上传到服务器目录

Apache http 服务器每 60 秒断开一次连接

java - Eclipse Maven 工作区解析看不到生成的类

Tomcat conf 文件夹位置更改?