论坛首页 Java企业应用论坛

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

浏览 14042 次
精华帖 (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;   
            }   
        }   
    }   

好吧 你要鱼就给你鱼 看好了

 

0 请登录后投票
   发表时间:2011-05-16  
悲剧了 写道
shanga 写道
在23行代码中,楼主做了创造主,创造了无数的逃逸对象,但他只握住了女娲,是何等的专一,使我想起了中国警察的故事。这些逃逸对象做的事(楼主说得instance存在),但是实际上抛出connection close错误,因为楼主只记住女娲,其他人一个也没放眼里。



哥们,我语文不太好,真没看懂

new的对象没引用,就成了逃逸对象,这就是你debug到instance存在,而connection closed(就是我刚刚说的女娲)的原因。而且你这个所谓的单例也写的。。。。
0 请登录后投票
   发表时间: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;   
            }   
        }   
    }   

好吧 你要鱼就给你鱼 看好了

 

。。。。。。。

0 请登录后投票
   发表时间:2011-05-16  
shanga 写道
悲剧了 写道
shanga 写道
在23行代码中,楼主做了创造主,创造了无数的逃逸对象,但他只握住了女娲,是何等的专一,使我想起了中国警察的故事。这些逃逸对象做的事(楼主说得instance存在),但是实际上抛出connection close错误,因为楼主只记住女娲,其他人一个也没放眼里。



哥们,我语文不太好,真没看懂

new的对象没引用,就成了逃逸对象,这就是你debug到instance存在,而connection closed(就是我刚刚说的女娲)的原因。而且你这个所谓的单例也写的。。。。



new对象只是为了调用构造方法时候,给instance赋值,我还是没太明白你的意思
0 请登录后投票
   发表时间:2011-05-16  
哎,这代码写的。第一个的close的关闭顺序就有问题。
第二个,你在返回后再传入的Connection已经不是ConnectionUtil类中那个类变量了。
不会影响instance的。所以拿到的永远是同个一个Connection.
再说了instance是个类变量。只要它有值了,所有实例是共有的。

哎,杯具呀。
0 请登录后投票
   发表时间:2011-05-16  
woaiwofengkuang 写道
哎,这代码写的。第一个的close的关闭顺序就有问题。
第二个,你在返回后再传入的Connection已经不是ConnectionUtil类中那个类变量了。
不会影响instance的。所以拿到的永远是同个一个Connection.
再说了instance是个类变量。只要它有值了,所有实例是共有的。

哎,杯具呀。



哥们你还真没说到点子上,这个是由于咋们java基础不好,建议你看看前面的帖子
0 请登录后投票
   发表时间: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

 

楼主可以看一下。

0 请登录后投票
   发表时间:2011-05-16  
1  单例模式 应用错误
2  由于单例使用错误 多次getconnection都是同一连接  调用一次close 其他地方持有的连接全部报废...
3  关闭连接时候并不判断是不是本池所产生的 就乱关闭 这样关闭了连接并未多对象池的连接造成任何影响.
剩下的就是 次要错误了, 解决了这三个其他的自然就没有错误了..
0 请登录后投票
   发表时间: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试试,传个其它引用对象试试,看看是不是改的原有对象,基本类型和引用类型是不一样的。



哎,这就是典型的参数传递问题。
java中只有值传递的。当你传一个引用类型的参数时,实际上是将引用copy一份传过去。所以在方法中将copy的新的引用设为null是不会影响,原先外部的引用的。
用图来说明:

第一张是传值copy后再设为空的。

第二第是传传时copy的。

 

 

  • 大小: 13 KB
  • 大小: 12 KB
0 请登录后投票
   发表时间: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试试,传个其它引用对象试试,看看是不是改的原有对象,基本类型和引用类型是不一样的。



哎,这就是典型的参数传递问题。
java中只有值传递的。当你传一个引用类型的参数时,实际上是将引用copy一份传过去。所以在方法中将copy的新的引用设为null是不会影响,原先外部的引用的。
用图来说明:

第一张是传值copy后再设为空的。

第二第是传传时copy的。

 

 

就是这么回事,对了哥们,这帖子能结贴吗?

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

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