论坛首页 Java企业应用论坛

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

浏览 14040 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-16  
悲剧了 写道
jinyao 写道
你是把connection关闭了  而不是置空



finally{ 
                con=null; 
            } 


最后有句这个代码



这代码写的,,哎,不要修改参数,这是一个不好的习惯,再说,参数只是一个形式参数,不会对实际参数产生变化。这个不是C指针!
0 请登录后投票
   发表时间:2011-05-16  
sswh 写道

代码真够混乱的。

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

悲剧了 写道
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 并没有受到影响。

这位朋友正解,你应该这样用finally{  
              ConnectionUtil.instance =null;
} ,但是如此非常怀疑你用单例模式的必要性
0 请登录后投票
   发表时间:2011-05-16  
sswh 写道

代码真够混乱的。

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

悲剧了 写道
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 并没有受到影响。




调用的时候close(instance )
0 请登录后投票
   发表时间:2011-05-16  
close()中还要加一句instance = null;
0 请登录后投票
   发表时间:2011-05-16  
mercyblitz 写道
悲剧了 写道
jinyao 写道
你是把connection关闭了  而不是置空



finally{ 
                con=null; 
            } 


最后有句这个代码



这代码写的,,哎,不要修改参数,这是一个不好的习惯,再说,参数只是一个形式参数,不会对实际参数产生变化。这个不是C指针!



这样写是为了保证con没有被关闭,最终强制把他赋值为null
0 请登录后投票
   发表时间:2011-05-16  
gaosheng08 写道
close()中还要加一句instance = null;


调用的时候传进来的就是instance ,这个connection是通过这个类的getConnection()得到的
0 请登录后投票
   发表时间:2011-05-16  
悲剧了 写道
jinyao 写道
你这是单例,下次调用connection的时候当然不为空



是单例,但是调用关闭方法,把instance关闭了的,就是单例里面instance为null了,那么它会再次new一次


关闭方法中只是把数据库rs、ps、conn关闭了,但instance并不为null,要显示将instance置为null
0 请登录后投票
   发表时间:2011-05-16  
悲剧了 写道
gaosheng08 写道
close()中还要加一句instance = null;


调用的时候传进来的就是instance ,这个connection是通过这个类的getConnection()得到的

lz你难道不知道java通过close方法传递进去的instance只是个引用吗,真正的instance是不会置为null的??
0 请登录后投票
   发表时间:2011-05-16  
gaosheng08 写道
悲剧了 写道
jinyao 写道
你这是单例,下次调用connection的时候当然不为空



是单例,但是调用关闭方法,把instance关闭了的,就是单例里面instance为null了,那么它会再次new一次


关闭方法中只是把数据库rs、ps、conn关闭了,但instance并不为null,要显示将instance置为null




那个close(0方法中的conn就是getConnection()得到的intance,里面已经con=null显示关闭了


0 请登录后投票
   发表时间:2011-05-16  
悲剧了 写道
mercyblitz 写道
悲剧了 写道
jinyao 写道
你是把connection关闭了  而不是置空



finally{ 
                con=null; 
            } 


最后有句这个代码



这代码写的,,哎,不要修改参数,这是一个不好的习惯,再说,参数只是一个形式参数,不会对实际参数产生变化。这个不是C指针!



这样写是为了保证con没有被关闭,最终强制把他赋值为null


看来楼主不太明白,编译器工作原理呀~

你自己想象,一个Connection够吗?建议看一下Connection Pool的原理,Apache DBCP就是简单的实现。
0 请登录后投票
论坛首页 Java企业应用版

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