登录时报错 connection is closed

by_name6 2015-11-17 01:08:57
我用struts2.0做的网站,tomcat做服务器,连接数据库的方式为,数据库连接池,用一个静态方法进行连接,代码如下
public static Connection getConnection(){
Connection conn = null;
try {
Context c = new InitialContext();
DataSource ds = (DataSource)c.lookup("java:comp/env/jdbc/jlbzy");
conn = ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
每次获取连接时用 DB.getConnection(),用完了就conn.closed,自己测试时大多数情况下还没发现问题,只有登录的时候,当执行到conn.closeed的时候, 会报一个conection is closed的错。
...全文
1095 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hsliwei 2015-11-18
  • 打赏
  • 举报
回复
释放资源前判断下资源是否释放了。释放了就不用再释放
_南天北落 2015-11-18
  • 打赏
  • 举报
回复
回复的edit真卡。 1. 不能写成静态的,改为获取的时候需要实例。静态造成的问题,public静态会造成串,不知道到底谁开的连接,谁去关闭连接。反正是共用的。 2. Pool类的free方法,每次自动执行?可能是别的类直接调用的,你需要看下你的别的类代码;要看下是有定时任务还是什么?如果没有调用free方法的话应该是不会执行的。 3. 你的会关闭的原因,是不是由于你是静态的,已经被别的方法关闭了;然后你又关闭了一次。你改为实例之后每次关闭该实例的;应该就没问题了。
_南天北落 2015-11-18
  • 打赏
  • 举报
回复
引用 3 楼 by_name6 的回复:
[quote=引用 1 楼 my_God_sky 的回复:] 贴代码吧。一般情况是不会的。
数据库连接类如下: public class Pool { protected Connection conn; protected Statement stmt; protected ResultSet rs; protected String sql; public static Connection getConnection(){ Connection conn = null; try { Context c = new InitialContext(); DataSource ds = (DataSource)c.lookup("java:comp/env/jdbc/jlbzy"); conn = ds.getConnection(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } //释放资源 public static void free(ResultSet rs, PreparedStatement pstmt, Connection conn) { try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pstmt != null) pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null){ conn.close();} } catch (SQLException e) { e.printStackTrace(); } } } } 数据库操作类如下: public class AdminDao{ Connection conn; PreparedStatement pstmt; ResultSet rs; String sql ; public boolean login(String userName,String userPass){ conn = Pool.getConnection(); boolean flag = false; sql = "select * from admin where userName = ? and userPass = ?"; try { pstmt = conn.prepareStatement(sql); pstmt.setString(1, userName); pstmt.setString(2, userPass); rs = pstmt.executeQuery(); if(rs.next()){ flag = true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Pool.free(rs, pstmt, conn); } return flag; } } 附加问题:观察日志,Pool类的free方法,会每隔一会自动运行一次,而并不是我想象的只有执行到Poll.free()的时候才运行,为什么呢[/quote]
public class Pool {

 protected Connection conn;
 protected Statement stmt;
 protected ResultSet rs;
 protected String sql;

 public Connection getConnection(){
 Connection conn = null;
 try {
 Context c = new InitialContext();
 DataSource ds = (DataSource)c.lookup("java:comp/env/jdbc/jlbzy");
 conn = ds.getConnection();
 } catch (NamingException e) {
 e.printStackTrace();
 } catch (SQLException e) {
 e.printStackTrace();
 }
 return conn;
 }
 //释放资源
public void free(ResultSet rs, PreparedStatement pstmt, Connection conn) {
 try {
 if (rs != null)
 rs.close();
 } catch (SQLException e) {
 e.printStackTrace();
 } finally {
 try {
 if (pstmt != null)
 pstmt.close();
 } catch (SQLException e) {
 e.printStackTrace();
 } finally {
 try {
 if (conn != null){
 conn.close();}
 } catch (SQLException e) {
 e.printStackTrace();
 }
 }
 }
 }
 
数据库操作类如下:
 public class AdminDao{
 Connection conn;
 PreparedStatement pstmt;
 ResultSet rs;
 String sql ;
 Pool pool = new Pool();

public boolean login(String userName,String userPass){
 conn = pool.getConnection();
 boolean flag = false;
 sql = "select * from admin where userName = ? and userPass = ?";
 try {
 pstmt = conn.prepareStatement(sql);
 pstmt.setString(1, userName);
 pstmt.setString(2, userPass);
 rs = pstmt.executeQuery();
 if(rs.next()){
 flag = true;
 }
 } catch (SQLException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }finally{
 pool.free(rs, pstmt, conn);
 }
 return flag;
 }
 }
 
小刀打铁 2015-11-17
  • 打赏
  • 举报
回复
正确的做法: 1 每个sql执行都去重新申请一个connection。 2 如果每个连接都要重新申请,建立连接的时间慢,影响效率,一般实际运用中都选用数据库连接池。 可以考虑c3p0,dbcp 数据库连接池。
by_name6 2015-11-17
  • 打赏
  • 举报
回复
引用 6 楼 kellahzhy 的回复:
兄弟,你知道什么事web开发吗 connection做成静态,你连多用户都支持不了,更不用说多线程了。
哥哥,该怎么弄呢
用心做软件 2015-11-17
  • 打赏
  • 举报
回复
兄弟,你知道什么事web开发吗 connection做成静态,你连多用户都支持不了,更不用说多线程了。
by_name6 2015-11-17
  • 打赏
  • 举报
回复
引用 4 楼 soton_dolphin 的回复:
CONNECTION 一定不可以用静态。整个类共享一个数据连接就出这个错误
我也听说过这个connection不能用静态类,但正确的做法是什么呢,这个问题一直困扰我,如果不用静态方法,而用实例方法,开销会不会太大呢?大神教我
soton_dolphin 2015-11-17
  • 打赏
  • 举报
回复
CONNECTION 一定不可以用静态。整个类共享一个数据连接就出这个错误
by_name6 2015-11-17
  • 打赏
  • 举报
回复
引用 1 楼 my_God_sky 的回复:
贴代码吧。一般情况是不会的。
数据库连接类如下: public class Pool { protected Connection conn; protected Statement stmt; protected ResultSet rs; protected String sql; public static Connection getConnection(){ Connection conn = null; try { Context c = new InitialContext(); DataSource ds = (DataSource)c.lookup("java:comp/env/jdbc/jlbzy"); conn = ds.getConnection(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } //释放资源 public static void free(ResultSet rs, PreparedStatement pstmt, Connection conn) { try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pstmt != null) pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null){ conn.close();} } catch (SQLException e) { e.printStackTrace(); } } } } 数据库操作类如下: public class AdminDao{ Connection conn; PreparedStatement pstmt; ResultSet rs; String sql ; public boolean login(String userName,String userPass){ conn = Pool.getConnection(); boolean flag = false; sql = "select * from admin where userName = ? and userPass = ?"; try { pstmt = conn.prepareStatement(sql); pstmt.setString(1, userName); pstmt.setString(2, userPass); rs = pstmt.executeQuery(); if(rs.next()){ flag = true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ Pool.free(rs, pstmt, conn); } return flag; } } 附加问题:观察日志,Pool类的free方法,会每隔一会自动运行一次,而并不是我想象的只有执行到Poll.free()的时候才运行,为什么呢
坚决不改名 2015-11-17
  • 打赏
  • 举报
回复
自动关闭??
_南天北落 2015-11-17
  • 打赏
  • 举报
回复
贴代码吧。一般情况是不会的。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧