JDBC代码阅读中出现的问题

HaleyZhang 发布于 06/10 20:11
阅读 166
收藏 0
	static{
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}

上述的static是修饰的叫"代码块"是吧?为啥要用static修饰呢?是为了不重复创建只用static中已经存在的吗?

    

	public static void myClose(Connection conn,PreparedStatement ps,ResultSet rs) throws SQLException{
		//关闭资源的顺序,为按照创建资源的顺序逆序关闭
		if(rs!=null){
			rs.close();
		}
	
		if(ps!=null){
			ps.close();
		}
		
		if(conn!=null){
			conn.close();
			
			t.remove();
		}
	}

上边这段代码是封装的关闭资源,一直不太理解关闭资源的意思,是把资源对象销毁还是怎么样?比如说Connection关闭,是把连接给销毁,还是把连接归还给DataSourse?

 

还有一段代码是把连接放到ThreadLocal中,为了事务用的.ThreadLocal的变量名叫t.执行t.remove(),是干了什么,是把当前connection给销毁吗?还是怎么样?

还有一个问题?关于线程的.web应用中,当有用户访问的时候是不是就是创建一个线程?那这个线程什么时候会被销毁呢?还有就是是不是只要是线程没销毁,用户的所有操作就是用的threadlocal中的同一个线程?

加载中
0
w
weiaiyu071

static块是表示在加载类时就加载,不随对象创建而创建。为了避免一些只需要启动一次的东西被重复创建,浪费资源。

第二个线程关闭是马上退出cpu执行序列,但是还是在队列中。线程remove时,线程为准备销毁状态,不是马上就被销毁,也不是按顺序销毁。直到cpu空闲时他们会被自动销毁。即使你不写remove,当长时间cpu执行不到时,gc也会又改了认为这是废掉的线程,而自动销毁。但是为了养成好的编写习惯,不用就要根据对应得状态写关闭和销毁。

并发时,成员变量不是线程安全,那每个用户拿到的初始值就可能不一样。ThreadLocal是创建一个只限于当前线程(用户)的成员变量的副本,对本身的成员变量是不动的。所以这个remove知识把当前线程的这个链接给销毁了。如果有两个用户及以上你就会发现只有这个线程是关闭的,其余还是正常的运行

Java是面向对象编程,每个用户点击对应得功能那执行的代码都是一样的,跟这段代码封装在哪是没有什么关系的,每个用户确实都是执行ThreadLocal里面的代码,但是执行时每个用户都会创建这里的用到的成员变量的副本,每个线程之间是没有任何关系的。同一个用户也是有可能用两个ThreadLocal的。线程不用了是先准备销毁然后才会在别的时间销毁,而不是立即销毁

0
小呆呆的星空

关于第一问,你说的对了,还有就是有了static等同于该类的一个属性,加载这个类的时候调用一次,不会因创建对象时重复运行。

0
空丶
空丶

关闭应该就是把占用的内存释放掉。。。

返回顶部
顶部