数据库连接connection

java数据库连接在被创建后,当使用完后被关闭其对象并未立即销毁而只是与服务器断开,所以在写数据库的帮助类是要注意:如果获取的connection的定义是全局的,则在获取一个connection的判断时不能仅仅靠connection是否为null,这样是是很危险的,如下:

不推荐下面写法:

public class DbHelper{
	ResultSet re;
	Context ctx;
	DataSource ds;
	Connection conn;
	Statement st;

	/**
	 * <b>Summary: </b>
	 *     获取conn的值
	 * @return conn 
	 */
	public Connection getConn() {
		try {
			if(conn!=null&&!conn.isClosed()){
                   //假如此处只判断conn!=null则在系统第一次初始化时没问题;但一旦打开依次连接并关闭后,再次获取连接时就会报错“connection is closed” 但你在                   //fix这个Bug时却发现conn不为null。怎么回事,难道没关闭,实际上你已经关闭了,只是java并未销毁该对象,而只是让conn与服务器断开了连接
                   //所以才导致出错
                   //解决方法:1.在判断的地方要加上!conn.isClosed()2.再该类里的close()方法里关闭连接的后面加上conn=null(但若在获取conn后,不采用
                   //dbhelper对象去调用close()方法来关闭conn,而是自己手动写代码关闭的话,那么这个dbhelper对象的conn只是被关闭,仍然不为空,即使写了
                   //conn=null也无用,因为改变的只是你自己定义的conn的引用,而dbhelper对象自己的conn属性的引用仍然没变,所以这个方法有很大弊端)
                   //3.最好直接将connection定义为局部变量,每次直接获取,只不是在每次用完后必须一定要将其关闭就行了(这是最好的方法)
				return conn;
			}else{
				ctx = new InitialContext();
				DataSource ds = (DataSource) ctx.lookup("java:comp/env/sqlserver");
				conn = ds.getConnection();
			}
			
		} catch (NamingException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

      public void close() {
        try {
          if (re != null) {
            re.close();
          }
          st.close();
          conn.close();

          conn = null;//将该对象置空,放置判断出错
          ctx.close();
          } catch (SQLException e) {
          e.printStackTrace();
        } catch (NamingException e) {
          e.printStackTrace();
        }
      }

}

  推荐下面写法:

    上边将connection定义为全局的,这样造成很多麻烦,所以最好使用下面这种写法,将connection定位局部变量,每次直接获取,并保证使用后关闭就行了,这样免去了上面写法的判断麻烦

package com.zbj.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBManager {
	private final String DRIVER = "com.mysql.jdbc.Driver";
	private final String URL = "jdbc:mysql:///xxx";
	private final String USER = "root";
	private final String PASSWORD = "root";
	/*
	 * 获得连接
	 */
	public Connection getConnection(){
		Connection con = null;
		try {
			Class.forName(DRIVER);
			con = DriverManager.getConnection(URL,USER,PASSWORD);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return con;
	}
	/*
	 * close()
	 */
	public void close(Statement state,Connection conn){
		if(state != null) {
			try {
				state.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if(conn != null) {
					try {
						conn.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
	public void close(ResultSet rs,Statement state,Connection conn){
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if(state != null) {
					try {
						state.close();
					} catch (SQLException e) {
						e.printStackTrace();
					} finally {
						if(conn != null) {
							try {
								conn.close();
							} catch (SQLException e) {
								e.printStackTrace();
							}
						}
					}
				}
			}
		}
	}
}

  

posted @ 2012-11-16 00:25  zbjice  阅读(451)  评论(0)    收藏  举报