锁定老帖子 主题:一个常见的JDBC封装导致的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-16
public static void close(Connection con){ if(instance!=con){ throw new RunTimeException("你还给我的连接并不是从我这里拿走的(此处省略粗口1万字)...."); } if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ instance=con=null; } } } 好吧 你要鱼就给你鱼 看好了
|
|
返回顶楼 | |
发表时间:2011-05-16
悲剧了 写道 shanga 写道 在23行代码中,楼主做了创造主,创造了无数的逃逸对象,但他只握住了女娲,是何等的专一,使我想起了中国警察的故事。这些逃逸对象做的事(楼主说得instance存在),但是实际上抛出connection close错误,因为楼主只记住女娲,其他人一个也没放眼里。
哥们,我语文不太好,真没看懂 new的对象没引用,就成了逃逸对象,这就是你debug到instance存在,而connection closed(就是我刚刚说的女娲)的原因。而且你这个所谓的单例也写的。。。。 |
|
返回顶楼 | |
发表时间:2011-05-16
uin57 写道
public static void close(Connection con){ if(instance!=con){ throw new RunTimeException("你还给我的连接并不是从我这里拿走的(此处省略粗口1万字)...."); } if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ instance=con=null; } } } 好吧 你要鱼就给你鱼 看好了
。。。。。。。 |
|
返回顶楼 | |
发表时间:2011-05-16
shanga 写道 悲剧了 写道 shanga 写道 在23行代码中,楼主做了创造主,创造了无数的逃逸对象,但他只握住了女娲,是何等的专一,使我想起了中国警察的故事。这些逃逸对象做的事(楼主说得instance存在),但是实际上抛出connection close错误,因为楼主只记住女娲,其他人一个也没放眼里。
哥们,我语文不太好,真没看懂 new的对象没引用,就成了逃逸对象,这就是你debug到instance存在,而connection closed(就是我刚刚说的女娲)的原因。而且你这个所谓的单例也写的。。。。 new对象只是为了调用构造方法时候,给instance赋值,我还是没太明白你的意思 |
|
返回顶楼 | |
发表时间:2011-05-16
哎,这代码写的。第一个的close的关闭顺序就有问题。
第二个,你在返回后再传入的Connection已经不是ConnectionUtil类中那个类变量了。 不会影响instance的。所以拿到的永远是同个一个Connection. 再说了instance是个类变量。只要它有值了,所有实例是共有的。 哎,杯具呀。 |
|
返回顶楼 | |
发表时间:2011-05-16
woaiwofengkuang 写道 哎,这代码写的。第一个的close的关闭顺序就有问题。
第二个,你在返回后再传入的Connection已经不是ConnectionUtil类中那个类变量了。 不会影响instance的。所以拿到的永远是同个一个Connection. 再说了instance是个类变量。只要它有值了,所有实例是共有的。 哎,杯具呀。 哥们你还真没说到点子上,这个是由于咋们java基础不好,建议你看看前面的帖子 |
|
返回顶楼 | |
发表时间:2011-05-16
public class Test { public static void main(String args[]) { int i = 1; change(i); System.out.println(i); String str = "aaa"; change(str); System.out.println(str); StringBuffer strb = new StringBuffer("buffer"); change(strb); //strb=null;对比方法体内的null System.out.println(strb.toString()); Demo d = new Demo(); change(d.s); System.out.println(d.s); change(d); System.out.println(d.s); } public static void change(int i) { i = 0; } public static void change(String str) { str = "object property stay"; } public static void change(Demo demo) { demo.s = "object changed"; } public static void change(StringBuffer sb) { sb.append(" -- added"); //sb=null; sb.append(" -- added twice"); } } class Demo { String s = "initial string value"; }
结果:
aaa buffer -- added -- added twice initial string value object changed
楼主可以看一下。 |
|
返回顶楼 | |
发表时间:2011-05-16
1 单例模式 应用错误
2 由于单例使用错误 多次getconnection都是同一连接 调用一次close 其他地方持有的连接全部报废... 3 关闭连接时候并不判断是不是本池所产生的 就乱关闭 这样关闭了连接并未多对象池的连接造成任何影响. 剩下的就是 次要错误了, 解决了这三个其他的自然就没有错误了.. |
|
返回顶楼 | |
发表时间:2011-05-16
最后修改:2011-05-16
ericslegend 写道
悲剧了 写道
kakaluyi 写道
算了解释一下,发现楼主还是云里雾里
public void static main(String args[]) { int i=3; changevalue(i); System.out.println(i); //你以为i现在是2吧,错了,i还是3!不好意思楼主,你理解错误了。这个是很容易搞错的概念 } public void changevalue(int i) { i=2; } 恩,明白了,谢了 都说楼主不理解,我看回答问题的没几个理解的(当然,我也很菜),传个String试试,传个其它引用对象试试,看看是不是改的原有对象,基本类型和引用类型是不一样的。
第一张是传值copy后再设为空的。 第二第是传传时copy的。
|
|
返回顶楼 | |
发表时间:2011-05-16
woaiwofengkuang 写道
ericslegend 写道
悲剧了 写道
kakaluyi 写道
算了解释一下,发现楼主还是云里雾里
public void static main(String args[]) { int i=3; changevalue(i); System.out.println(i); //你以为i现在是2吧,错了,i还是3!不好意思楼主,你理解错误了。这个是很容易搞错的概念 } public void changevalue(int i) { i=2; } 恩,明白了,谢了 都说楼主不理解,我看回答问题的没几个理解的(当然,我也很菜),传个String试试,传个其它引用对象试试,看看是不是改的原有对象,基本类型和引用类型是不一样的。
第一张是传值copy后再设为空的。 第二第是传传时copy的。
就是这么回事,对了哥们,这帖子能结贴吗? |
|
返回顶楼 | |