问题描述
我用单例模拟了一个数据库连接,里面就一个数据库连接,页面刷新,或者查询,数据库就会增加session,一直刷新,不出1分钟,session就满了。有大神遇到过这样的问题吗?publicclassUtil{privatestaticjava.sql.Connectionconn=null;privateUtil(){};static{try{Class.forName("oracle.jdbc.driver.OracleDriver");conn=java.sql.DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:web","webapp","webapp");}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}java.sql.Connectionconn=SpringUtil.getConn();java.sql.Statementstm;try{stm=conn.createStatement();java.sql.ResultSetrs=stm.executeQuery("select1fromdual");rs.close();stm.close();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}这个连接一直连着数据库,按我的理解,我查询,使用这个连接,数据库应该不会增加session,不知道是什么原因,是不是程序错了,还是说数据库要配置什么,求大神指点迷津。。
解决方案
解决方案二:
少复制了一个方法publicstaticjava.sql.ConnectiongetConn(){returnconn;}
解决方案三:
解决方案四:
static{try{Class.forName("oracle.jdbc.driver.OracleDriver");conn=java.sql.DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:web","webapp","webapp");}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}//把获取Connection封装到方法里publicConnectiongetConn(){returnconn;}加上这个就OK了
解决方案五:
比较关键的一点,连接未在finally块进行释放。
解决方案六:
感觉你这代码有点乱java.sql.Connectionconn=SpringUtil.getConn();java.sql.Statementstm;try{stm=conn.createStatement();java.sql.ResultSetrs=stm.executeQuery("select1fromdual");rs.close();stm.close();}catch(SQLExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}这段是你调用connection来操作数据库的代码吧。你这数据库链接是从SpringUtil.getConn()这里来的。不是从你上面写的Util类获取的,那和你上面util类单例不单例有毛线关系?出现报错,应该是你这段调用代码没有关闭connection,导致数据库链接被用完了。你再请求链接就请求不到,所以就报错了。
解决方案七:
连接对象使用单例是想做什么?只有一个连接的连接池?
解决方案八:
conn记得要关闭来释放session,session是有限制的,配的再多要是不释放也会被用完