论坛首页 Java企业应用论坛

一个常见的JDBC封装导致的问题

浏览 14038 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-16   最后修改:2011-05-16
大家看一个数据库封装类
操作一次没问题,操作两次就报错
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.


Debug调试,发现connection不能真正关掉,使用connection完后,调用close()方法,下次getConnection()时候
instance不为null



public class ConnectionUtil {
	private final static String  url="jdbc:mysql://localhost:3306/qq?useUnicode=true&characterEncoding=UTF-8";
	private final static String  username="root";
	private final static String  password="root";
	private  static Connection   instance=null;
	
	private ConnectionUtil(){
		if(instance==null){
			try {
				Class.forName("org.gjt.mm.mysql.Driver");
				instance=DriverManager.getConnection(url, username, password);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
	}
	
	public static Connection getConnection(){
		if(instance==null){
			new ConnectionUtil();
		}
		return instance;
		
	}
	
	
	public static void close(Connection con,PreparedStatement ps,ResultSet rs){
		if(con!=null){
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				con=null;
			}
		}
		if(ps!=null){
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				ps=null;
			}
		}
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				rs=null;
			}
		}
		
	}
	
	public static void close(Connection con,PreparedStatement ps){
		if(con!=null){
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				con=null;
			}
		}
		if(ps!=null){
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				ps=null;
			}
		}
		
		
	}
	
	public static void close(Connection con){
		if(con!=null){
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				con=null;
			}
		}
	}

}



结贴了。。。。有其他结贴方式吗?
   发表时间:2011-05-16  
关闭对象的次序貌似有问题。。。
0 请登录后投票
   发表时间:2011-05-16  
Reset 写道
关闭对象的次序貌似有问题。。。



次序换了,但问题依旧
0 请登录后投票
   发表时间:2011-05-16   最后修改:2011-05-16
你这是单例,下次调用connection的时候当然不为空
0 请登录后投票
   发表时间:2011-05-16  
jinyao 写道
你这是单例,下次调用connection的时候当然不为空



是单例,但是调用关闭方法,把instance关闭了的,就是单例里面instance为null了,那么它会再次new一次
0 请登录后投票
   发表时间:2011-05-16  
你是把connection关闭了  而不是置空
0 请登录后投票
   发表时间:2011-05-16  
jinyao 写道
你是把connection关闭了  而不是置空



finally{ 
                con=null; 
            } 


最后有句这个代码
0 请登录后投票
   发表时间:2011-05-16  

代码真够混乱的。

本来不想回了,算了,还是说一下吧。

悲剧了 写道
public class ConnectionUtil {
	private  static Connection   instance=null;
}


这儿:instance是ConnectionUtil 类的静态变量。

悲剧了 写道
	public static void close(Connection con){
		if(con!=null){
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				con=null;
			}
		}
	}
}


这儿:close()方法中,置空的con=null,是方法参数。ConnectionUtil.instance 并没有受到影响。
0 请登录后投票
   发表时间:2011-05-16   最后修改:2011-05-16

兄弟直接用spring jdbctemplate吧

如果非要自己弄也试用datasource吧

如果非要connection,这样写ConnectionUtil吧:

 

public class ConnectionUtil {
	private final static String  url="jdbc:mysql://localhost:3306/qq?useUnicode=true&characterEncoding=UTF-8";
	private final static String  username="root";
	private final static String  password="root";
	
	public static Connection getConnection(){
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
			return DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			throw new IllegalStatusException(e);
		}
		
	}
	
	public static void close(Connection con,PreparedStatement ps,ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(ps!=null){
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		close(con);
	}
	
	public static void close(Connection con,PreparedStatement ps){
		close(con, ps, null);
	}
	
	public static void close(Connection con){
		if(con!=null){
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				con=null;
			}
		}
	}
}
 
0 请登录后投票
   发表时间:2011-05-16  

再说点其他的:

悲剧了 写道
	public static Connection getConnection(){
		if(instance==null){
			new ConnectionUtil();
		}
		return instance;
	}


按上下文的意思,应该是:
	public static Connection getConnection(){
		if(instance==null){
			instance = DriverManager.getConnection(url, username, password);
		}
		return instance;
	}


0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics