下面是一个servlet 里的 doPOST 方法的代码我tomcat 连接池 maxActive =8 结果执行8次后 就无法得到 Connection了(为null)而且getConnection变得很慢(等于maxWait设置的时间)如果我 maxActive 设置为4 那么就四次以后不行 我每次都很小心的关闭 为什么关闭的Connection无法再利用??
==================================================
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String keyword = request.getParameter("keyword");
boolean hasData = false;
Context ctx=null;
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/sample");
if(ds!=null){
conn=ds.getConnection();//问题所在!
}
if(conn != null){
HttpSession session = request.getSession();
session.setAttribute("sou4sou_keyword",keyword); stmt = conn.createStatement() ;
rs = stmt.executeQuery("select top 1 id from searchdata where keyword like '%"+keyword+"%'");
System.out.println("select top 1 id from searchdata where keyword like '%"+keyword+"%'");
if(rs.next()){
hasData = true;
}
}
rs.close();
rs = null;
stmt.close();
stmt = null;
conn.close(); // Return to connection pool
conn = null;
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if (rs != null) {
try { rs.close(); } catch (SQLException e) { ; }
rs = null;
}
if (stmt != null) {
try { stmt.close(); } catch (SQLException e) { ; }
stmt = null;
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { ; }
conn = null;
} }catch(Exception e){
}
}
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
if(hasData){
rd = sc.getRequestDispatcher("/list.jsp");
rd.forward(request,response);
}else{
rd = sc.getRequestDispatcher("/souproxy.jsp");
rd.forward(request,response);
}
}
==================================================
==================================================
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String keyword = request.getParameter("keyword");
boolean hasData = false;
Context ctx=null;
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/sample");
if(ds!=null){
conn=ds.getConnection();//问题所在!
}
if(conn != null){
HttpSession session = request.getSession();
session.setAttribute("sou4sou_keyword",keyword); stmt = conn.createStatement() ;
rs = stmt.executeQuery("select top 1 id from searchdata where keyword like '%"+keyword+"%'");
System.out.println("select top 1 id from searchdata where keyword like '%"+keyword+"%'");
if(rs.next()){
hasData = true;
}
}
rs.close();
rs = null;
stmt.close();
stmt = null;
conn.close(); // Return to connection pool
conn = null;
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if (rs != null) {
try { rs.close(); } catch (SQLException e) { ; }
rs = null;
}
if (stmt != null) {
try { stmt.close(); } catch (SQLException e) { ; }
stmt = null;
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { ; }
conn = null;
} }catch(Exception e){
}
}
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
if(hasData){
rd = sc.getRequestDispatcher("/list.jsp");
rd.forward(request,response);
}else{
rd = sc.getRequestDispatcher("/souproxy.jsp");
rd.forward(request,response);
}
}
==================================================
++++++++++++++++++++++++++++++++++
有关系么?操作的对象又不是的引用都交掉了吧
if(null!=conn)
conn.close();关于conn.close()所做的工作,不知道,感觉跟将conn=null后,getConnection()并不是立即为空,请楼上的解释下,说说清楚,谢谢了。
楼主在最后ctx.close();试试看会不会在出现这个问题。
还有的话应该是数据库驱动的问题了。楼主的jdbc是什么呢?