WECHAT2015 2015-06-28 02:14
浏览 2243

memory leak我的 jdbc 被强制注销

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,但是原先的表无法显示和新写的代码无法传递进去,发生了宕机。还望各路高手救命

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 matlab计算中误差
    • ¥15 对于相关问题的求解与代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
    • ¥15 保护模式-系统加载-段寄存器
    • ¥15 电脑桌面设定一个区域禁止鼠标操作
    • ¥15 求NPF226060磁芯的详细资料
    • ¥15 使用R语言marginaleffects包进行边际效应图绘制
    • ¥20 usb设备兼容性问题
    • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊