memory leak我的 jdbc 被强制注销, 我前几天还好好的,今天发现能够连到数据库oracle,但是新的程序无法在数据库中呈现出来,并且原来的表也没有了
The web application [UsersManager2] registered the JDBC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
这个是我的登录Servlet
package com.wzy.view;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
//返回一个界面(html技术)
out.println("<img src='imgs/1.png'/><hr/>");
out.println("<h1>用户登录</h1>");
//action 应该这样写/web应用名/Servlet的url
out.println("<form action='/UsersManager2/LoginCLServlet ' method='post'>");
out.println("用户名:<input type='text' name='id'/><br/>");
out.println("密码:<input type='password' name='password'/><br/>");
out.println("<input type='submit' value='登录'/><br/>");
out.println("</form>");
String errInfo=(String) request.getAttribute("err");
if(errInfo!=null){
out.println("<font color='red'>"+errInfo+"</font>");
}
out.println("<hr/><img src='imgs/2.png'/>");
}
** 这是登录处理转向Servlet**
package com.wzy.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginCLServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//向浏览器返回中文
request.setCharacterEncoding("utf-8");
//向控制台返回中文 在这里没什么用
//response.setContentType("text/html;charset=utf-8");
//PrintWriter out = response.getWriter();
//接收用户提交的用户名和密码
String id=request.getParameter("id");
String password=request.getParameter("password");
//到数据库中取验证
Connection ct = null;
ResultSet rs= null;
PreparedStatement ps=null;
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE","c##scott","tiger");
//3.创建PreparedStatement
ps=ct.prepareStatement("select * from users where id=? and passwd=?");
//给?赋值
ps.setObject(1,id);
ps.setObject(2, password);
//4.执行操作
rs=ps.executeQuery();
//5.根据结果做处理
if(rs.next()){
//说明该用户合法
request.getRequestDispatcher("/MainFrame").forward(request,response);
}else{
request.setAttribute("err", "用户id或者 密码有误!");
request.getRequestDispatcher("/LoginServlet").forward(request,response);
}
}catch (Exception e){
request.setAttribute("err", "您的输入id不是数字!");
request.getRequestDispatcher("/LoginServlet").forward(request,response);
e.printStackTrace();
}
finally{
//关闭资源
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs=null;
}
if(ps!=null ){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ps=null;
}
if(ct!=null){
try {
ct.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ct=null;
}
}
这是调转后第一个统筹页面****
package com.wzy.view;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MainFrame extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<img src='imgs/1.png'/>测试登录servlet页面</a> <a href='/UsersManager2/LoginServlet'>返回重新登录</a><hr/>");
//out.println("<h1>测试登录</h1>");
out.println("<h3>请选择您要进行的操作</h3>");
out.println("<a href='/UsersManager2/ManageUsers'>管理用户</a><br/>");
out.println("<a herf=''>添加用户</a><br/>");
out.println("<a herf=''>查找用户</a><br/>");
out.println("<a herf=''>退出系统</a><br/>");
out.println("<hr/><img src='imgs/2.png'/>");
}
接下来点进去会看到一张绿色的表10条信息我之前一直好好的****
这个是我用jdbc连接oracle 看表的地方现在被强制注销,
我明明打了finally 然后close了,可是 却说我的项目在web application停止后没有被释放,所以为了防止内存泄露要强行关闭jdbc驱动,导致我现在
无法用jdbc 来更新内容,想问一下究竟是怎么回事 , 还望高手指点
下面的程序只能显示到“管理用户”这一行
最下面的数字也能打印但是 jdbc的链接这里被停止了,我现在不明白的是导致我连不上的原因是哪里没被释放,还是要再注册一下呢?
package com.wzy.view;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ManageUsers extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<img src='imgs/1.png'/>测试登录servlet页面</a> <a href='/UsersManager2/LoginServlet'>返回主界面</a> <a href='/UsersManager2/LoginServlet'>安全退出</a><hr/>");
out.println("<h1>管理用户</h1>");
//从数据库中取出用户信息,并显示
//到数据库中去验证
Connection ct=null;
ResultSet rs=null;
PreparedStatement ps=null;
try{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE","c##scott","tiger");
//算出共有多少页
rs=ps.executeQuery();
//1.查询rowCount
rs.next();
//把游标下移
//4.执行操作
rs=ps.executeQuery();
out.println("<table border=1px bordercolor=green cellspacing=0 width=500px>");
out.println("<tr><th>id</th><th>用户名</th><th>email</th><th>级别</th></tr>");
//循环显示所有用户信息
while(rs.next()){
out.println("<tr><td>"+rs.getInt(1)+
"</td><td>"+rs.getString(2)+
"</td><td>"+rs.getString(3)+
"</td><td>"+rs.getInt(4)+
"</td></tr>");
}
out.println("</table>");
//显示分页
}catch(Exception e){
}finally{
//关闭资源
if(rs!=null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
rs=null;
}
if(ps!=null){
try{
ps.close();
}catch (SQLException e){
e.printStackTrace();
}
ps=null;
}
if(ct!=null){
try{
ct.close();
}catch(SQLException e){
e.printStackTrace();
}
ct=null;
}
out.println("1324234");
}
望大神指教,网上有用dbcp 重新写个close和改变 dbcp的配置来解决的,可我是新手还不懂hibernate
也有到server.xml里去关掉memory leak的监听,我试了,不行,我现在的情况是能够连到数据库oracle,但是原先的表无法显示和新写的代码无法传递进去,发生了宕机。还望各路高手救命