mail1239 2016-11-02 02:00 采纳率: 0%
浏览 2277
已结题

java数据库连接池内存泄漏

最近进行编程的时候项目上线了,可是查询不了几次就发现出现连接池获取不到连接,我把连接池已经调到1000了,可是还是出现这种问题。所以怀疑我的数据库连接写的时候有问题,还请各位大神帮忙看看是怎么回事。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DBDAO {

public static Connection getCon(){
    Connection conn=null;
    try{
    Context context = new InitialContext();
    //Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    /*String url="jdbc:sqlserver://localhost:1433;DatabaseName=cx";
     String user="sa";
     String password="123456";
     Connection conn= DriverManager.getConnection(url,user,password);*/
    //获得数据源
    Context envctx = (Context) context.lookup("java:comp/env");

    DataSource ds = (DataSource) envctx.lookup("jdbc/DB");

    //获取连接
     conn = ds.getConnection();} catch (Exception e) {
        e.printStackTrace();
    }

   return conn;

}
  //查询语句
public static ResultSet executeQuery(String sql) throws SQLException {

     Connection con = getCon();
     java.sql.Statement stmt = con.createStatement();
     ResultSet rs = stmt.executeQuery(sql);
      return rs;
}

public static ResultSet executeQuery(String sql, Object... obj)   {
     ResultSet rs =null;
    try{
   Connection con = getCon();

   PreparedStatement pstmt = con.prepareStatement(sql);
   for (int i = 0; i < obj.length; i++) {
         pstmt.setObject(i + 1, obj[i]);

   }
    rs = pstmt.executeQuery();   

    } catch (Exception e) {
        e.printStackTrace();
    }
   return rs;

}
//执行增删改
public static ResultSet executeNonSelect(String sql) throws SQLException {
Connection con = getCon();
Statement stmt = con.createStatement();

return stmt.executeQuery(sql);

}
public static void executeNonReturn(String sql) {
Connection con=null;
Statement stmt=null;
try{
con= getCon();
stmt= con.createStatement();

stmt.execute(sql);
if(stmt!=null)stmt.close();
if(con!=null)con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{

        if(stmt!=null)
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        if(con!=null)
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

}}
我调用的函数是这样写的
public static List getStudyCourse(String openid) {
// TODO Auto-generated method stub
ArrayList bkbs =new ArrayList();

        if(null==openid)return null;

        ResultSet rs=DBDAO.executeQuery("select * from buser,xsbkb where openid=? and xh=username and xksj='2016-03-01 00:00:00' ",openid);
        try {

            if(!rs.next())return null;

        do{
            Xsbkb bkb=new Xsbkb();
            bkb.setXh(rs.getString("xh" +
                    ""));
            bkb.setXm(rs.getString("xm"));
            bkb.setSjh(rs.getString("Sjh"));
            bkb.setKcmc(rs.getString("kcmc"));
            if(rs.getString("bz")!=null){
            bkb.setBz(rs.getString("bz"));
            }


            bkbs.add(bkb);

        }while(rs.next());
         if(rs!=null) rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            if(rs!=null)
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
        System.out.println("==================="+bkbs.size());
        return bkbs; 
}

我都关闭了连接 怎么还是出现获取不到连接呢

  • 写回答

5条回答 默认 最新

  • viewgroup 2016-11-02 02:43
    关注

    并没有看到你使用过的Connection被释放啊,你应该写一个释放的方法,查询过一次之后或者这个会话结束之后,关闭当前的数据库连接。你执行的方法里面
    释放的是rs不是con。

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站