问题描述
我在项目中创建了一个SahredPoolDataSource对象,把这个对象放到hashMap中,每次用连接的时候都从map中取出这个对象,并且强制转换为DataSource类型,然后从里面取连接,为什么有时候取得时候会出项Connectionisclosed的异常。这个SharedPoolDataSource是一个连接池吧。我关闭连接的时候使用conn.closed()就可以吧。publicclassDataSourceTest{publicstaticvoidcreateDataSource()throwsException{DriverAdapterCPDScpds=newDriverAdapterCPDS();cpds.setDriver(driver);cpds.setUrl(url);cpds.setUser(user);cpds.setPassword(password);cpds.setLoginTimeout(0);SharedPoolDataSourcespds=newSharedPoolDataSource();spds.setConnectionPoolDataSource(cpds);spds.setMaxActive(50);spds.setMaxWait(6000);spds.setMaxIdle(50);ds.put("dataSource",spds);}//取连接publicstaticConnectiongetConnection()throwsSQLException{Connectionconn=((DataSource)ds.get("dataSource")).getConnection();returnconn;}}
还有,在项目初始化的时候,我取了一个连接放到一个静态变量中,有时候使用用这个连接的时候也会出现Connectionisclosed的异常。publicclassMainServer{publicstaticvoidinit()throwsException{UtilTools.STAT_CONNECTION=DataSourceTest.getConnection();}publicstaticvoidmain(String[]args){try{MainServer.init();}catch(Exceptione){e.printStackTrace();}}}
解决方案
解决方案二:
静态变量维护连接池肯定会出现closed的问题的呀仔细想想分析下连接池的原理,连接池的一些属性例如:活跃时间啊搞明白连接池原理就可以很容易想明白这个问题了
解决方案三:
不懂连接池啊,什么原理呢,还有我从map中直接取连接怎么有时候也抛出connectionisclosed的异常?
解决方案四:
引用2楼he1hehe的回复:
不懂连接池啊,什么原理呢,还有我从map中直接取连接怎么有时候也抛出connectionisclosed的异常?
因为你长时间不用,数据库那边已经把连接关了,而你本地的连接池没有去检测连接状态。
解决方案五:
我去连接的时候都是前两个报错,再取连接就没事了。怎么检测啊,我刚搜了一下,是这段代码吗,我明天试试。spds.setTestOnBorrow(true);spds.setTestWhileIdle(true);spds.setValidationQuery("selete1fromdual");