Java 数据源上的getConnection引发NullPointerException

Java 数据源上的getConnection引发NullPointerException,java,tomcat,jdbc,datasource,jndi,Java,Tomcat,Jdbc,Datasource,Jndi,我在学习为我的Web应用程序设置数据库连接时,遇到了一个链接。我以TomCat为例,用数据库信息配置了conf/Server.xml。这是我的Conf/server.xml文件- <Resource name="jdbc/MyMagnumFt" global="jdbc/MyMagnumFt" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jd

我在学习为我的Web应用程序设置数据库连接时,遇到了一个链接。我以TomCat为例,用数据库信息配置了conf/Server.xml。这是我的Conf/server.xml文件-

<Resource name="jdbc/MyMagnumFt" 
      global="jdbc/MyMagnumFt" 
      auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="jdbc:oracle:thin:@<<myCorrectURL>>" 
      username="user" 
      password="pass"     
      maxActive="100" 
      maxIdle="20" 
      minIdle="5" 
      maxWait="10000"/>
<ResourceLink name="jdbc/MyLocalMagnumFt"
            global="jdbc/MyMagnumFt"
            auth="Container"
            type="javax.sql.DataSource" />
lookup()处理文件并获取我在server.xml中编码的数据源信息。然而,当控件转到getConnection()语句时,它会退出try块并落在finally块的rs.close()语句中。在控制台中,我看到以下错误-

May 15, 2017 4:27:46 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [ResourcePool] in context with path [/myJNDI2] threw exception
java.lang.NullPointerException
    at org.ashu.tester.ResourcePool.doGet(ResourcePool.java:65)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
现在,我浏览了不同的帖子,将数据源配置为在Application's context.xml中设置数据库信息和在web.xml中创建条目,但我想给这个示例一个尝试,并设置一个所有应用程序都可以使用的全局数据源

请让我知道,如果我在这里遗漏了什么,或者如果你需要更多的细节。这是我的项目设置的屏幕截图-

这是完整的代码-

package org.ashu.tester;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class ResourcePool extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InitialContext ctx = null;
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    try{
        ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalMagnumFt");

        con = ds.getConnection();
        stmt = con.createStatement();

        rs = stmt.executeQuery("select empid, name from Employee");

        PrintWriter out = response.getWriter();
        response.setContentType("text/html");
        out.print("<html><body><h2>Employee Details</h2>");
        out.print("<table border=\"1\" cellspacing=10 cellpadding=5>");
        out.print("<th>Employee ID</th>");
        out.print("<th>Employee Name</th>");

        while(rs.next())
        {
            out.print("<tr>");
            out.print("<td>" + rs.getInt("empid") + "</td>");
            out.print("<td>" + rs.getString("name") + "</td>");
            out.print("</tr>");
        }
        out.print("</table></body><br/>");

        //lets print some DB information
        out.print("<h3>Database Details</h3>");
        out.print("Database Product: "+con.getMetaData().getDatabaseProductName()+"<br/>");
        out.print("Database Driver: "+con.getMetaData().getDriverName());
        out.print("</html>");

    }catch(NamingException e){
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }finally{
        try {
            rs.close();
            stmt.close();
            con.close();
            ctx.close();
        } catch (SQLException e) {
            System.out.println("Exception in closing DB resources");
        } catch (NamingException e) {
            System.out.println("Exception in closing Context");
        }

    }
}
package org.ashu.tester;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.sql.Connection;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.sql.Statement;
导入javax.naming.Context;
导入javax.naming.InitialContext;
导入javax.naming.NamingException;
导入javax.servlet.ServletException;
导入javax.servlet.annotation.WebServlet;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.sql.DataSource;
公共类资源池扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
InitialContext ctx=null;
连接con=null;
语句stmt=null;
结果集rs=null;
试一试{
ctx=新的InitialContext();
DataSource ds=(DataSource)ctx.lookup(“java:/comp/env/jdbc/MyLocalMagnumFt”);
con=ds.getConnection();
stmt=con.createStatement();
rs=stmt.executeQuery(“选择empid,员工姓名”);
PrintWriter out=response.getWriter();
response.setContentType(“text/html”);
打印(“员工详细信息”);
输出。打印(“”);
打印(“员工ID”);
打印(“员工姓名”);
while(rs.next())
{
输出。打印(“”);
打印(“+rs.getInt(“empid”)+”);
out.print(“+rs.getString(“name”)+”);
输出。打印(“”);
}
输出。打印(“
”); //让我们打印一些数据库信息 打印(“数据库详细信息”); 打印(“数据库产品:“+con.getMetaData().getDatabaseProductName()+”
”); 打印(“数据库驱动程序:+con.getMetaData().getDriverName()); 输出。打印(“”); }捕获(NamingE例外){ e、 printStackTrace(); }捕获(SQLE异常){ e、 printStackTrace(); }最后{ 试一试{ rs.close(); stmt.close(); con.close(); ctx.close(); }捕获(SQLE异常){ System.out.println(“关闭数据库资源中的异常”); }捕获(NamingE例外){ System.out.println(“结束上下文中的异常”); } } }
}

package org.ashu.tester;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class ResourcePool extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InitialContext ctx = null;
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    try{
        ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalMagnumFt");

        con = ds.getConnection();
        stmt = con.createStatement();

        rs = stmt.executeQuery("select empid, name from Employee");

        PrintWriter out = response.getWriter();
        response.setContentType("text/html");
        out.print("<html><body><h2>Employee Details</h2>");
        out.print("<table border=\"1\" cellspacing=10 cellpadding=5>");
        out.print("<th>Employee ID</th>");
        out.print("<th>Employee Name</th>");

        while(rs.next())
        {
            out.print("<tr>");
            out.print("<td>" + rs.getInt("empid") + "</td>");
            out.print("<td>" + rs.getString("name") + "</td>");
            out.print("</tr>");
        }
        out.print("</table></body><br/>");

        //lets print some DB information
        out.print("<h3>Database Details</h3>");
        out.print("Database Product: "+con.getMetaData().getDatabaseProductName()+"<br/>");
        out.print("Database Driver: "+con.getMetaData().getDriverName());
        out.print("</html>");

    }catch(NamingException e){
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }finally{
        try {
            rs.close();
            stmt.close();
            con.close();
            ctx.close();
        } catch (SQLException e) {
            System.out.println("Exception in closing DB resources");
        } catch (NamingException e) {
            System.out.println("Exception in closing Context");
        }

    }
}