Java 数据源上的getConnection引发NullPointerException
我在学习为我的Web应用程序设置数据库连接时,遇到了一个链接。我以TomCat为例,用数据库信息配置了conf/Server.xml。这是我的Conf/server.xml文件-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
<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");
}
}
}