2013-08-16 63 views
3

我正在尝试使用Tomcat/JNDI读取MS SQL Server数据库表。我从上表没有问题,看如果我手动硬编码的数据源到我的Java源代码,但是当我尝试使用JNDI来加载数据源,我得到一个ClassNotFoundException:在Tomcat中加载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) 

我不希望看到这样的因为我将微软的JDBC驱动程序(sqljdbc4.jar)存储在Tomcat的lib目录中(而不是应用程序的WEB-INF/lib),并且因为它将DataSource硬编码到我的Java源代码中时工作良好。有没有人有任何想法,为什么会发生这种情况,或者知道在使用JNDI资源时,Tomcat需要指定将lib目录添加到类路径的其他任何内容?

的context.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(); 
+0

试试这个话题 http://stackoverflow.com/questions/8253958/classnotfoundexception-when-using-custom-sslsocketfactory/31690328#31690328 –

回答

0

事实证明,我使用com.microsoft.jdbc.sqlserver.SQLServerConnectionPoolDataSource作为驱动程序类名。事实上,它是com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource。又名 - PEBCAK。

0

的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中的示例。以下情况如何?而不是寻找的资源,你可以注入到servlet中。见Connect to Datasource without resource-ref in web.xml

+0

我实际上尝试,以及在解决我公司提供。相反,我只是为'com.microsoft.sqlserver.jdbc.SQLServerDriver'获得一个ClassNotFoundException。 – upcrob

相关问题