关于数据库连接对象泄露的思考
在项目里,看到如果有单独创建线程跑的操作,到最后都会主动清空线程里的状态,包括持有的数据库连接池对象。
后来专门在用AOP写了一个归还数据库连接对象的切面方法。在所有线程对象执行完主体run方法后,都主动清空持有的连接池对象,其目的就是为了防止连接池对象泄露。
因为在一个项目中,数据库连接池的对象是有限的,而其实连接池对象不是线程安全的,所以一个线程一般就只对应一个连接池对象。
当新创建一个线程后,并且线程已经执行完了任务,如果不主动回收,那么数据库连接池是不会把这个已经分配出去的连接池对象拿回来复用的。
除非等到GC的时候,线程对象被回收了,此时连接池对象才会归还。但是在实际项目中,GC的频率不会很高,因此这就导致了,如果有大量的连接池对象没有被回收,就会有耗尽的危险,而那些
占有着连接池对象的线程也没有使用,这就导致了资源浪费和资源耗尽,最终导致其他线程在执行任务的时候无法获取到连接池对象,也就无法提交事务到数据库了。