com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.


com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:862)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1237)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1232)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4131)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4100)
at dao.impl.UserLoginDaoImpl.checkLogin(UserLoginDaoImpl.java:18)
at MyServlet.LoginServlet.doPost(LoginServlet.java:65)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

 
原因應該是這樣。在對數據庫操作結束后關閉連接是正確的做法,沒什么大問題。至於出現:No operations allowed after connection closed。這樣的問題原因只有一個,你這里和數據庫的連接Connection是一個Static的,程序共享這一個Connection。所以第一 次對數據庫操作沒問題,當把Connection關閉后,第二次還想操作數據庫時Connection肯定不存在了。(每次開啟tomcat后第一次能成功,刷新之后第二次就報了錯)
實驗了下,當我把con.close()注釋了之后,就沒報這個錯誤了,那應該如何解決呢?
后來檢查發現是我把連接寫在了自己建的數據庫連接工具類DBUtils里的靜態塊中,如下:
 1 public class DBUtils {  2     static Connection con;  3     //讀取配置文件
 4     static{  5         Properties ps = new Properties();  6         //不需要寫后綴名
 7         ResourceBundle rundle = ResourceBundle.getBundle("db");  8         String driver = rundle.getString("driver");  9         String url = rundle.getString("url"); 10         String user = rundle.getString("username"); 11         String password = rundle.getString("password"); 12         
13         try { 14             //加載數據庫驅動
15  Class.forName(driver); 16         } catch (ClassNotFoundException e) { 17             // TODO Auto-generated catch block
18  e.printStackTrace(); 19  } 20         try { 21             //數據庫連接
22             con = DriverManager.getConnection(url, user, password); 23         } catch (SQLException e) { 24             // TODO Auto-generated catch block
25  e.printStackTrace(); 26  } 27         
28  } 29     public static Connection getconnection(){ 30         return con; 31  } 32 }

導致了數據庫連接只創建了一次,等我調用con.close()后,再次獲取數據庫連接就不存在了

當我把靜態塊中的內容移動到獲取數據庫連接的方法里(讓它每次調用方法的時候就創建一次連接),終於不報錯了,搞定!!!!

 1 public class DBUtils {  2     static Connection con;  3     //讀取配置文件
 4     public static Connection getconnection(){  5         Properties ps = new Properties();  6         //不需要寫后綴名
 7         ResourceBundle rundle = ResourceBundle.getBundle("db");  8         String driver = rundle.getString("driver");  9         String url = rundle.getString("url"); 10         String user = rundle.getString("username"); 11         String password = rundle.getString("password"); 12         
13         try { 14             //加載數據庫驅動
15  Class.forName(driver); 16         } catch (ClassNotFoundException e) { 17             // TODO Auto-generated catch block
18  e.printStackTrace(); 19  } 20         try { 21             //數據庫連接
22             con = DriverManager.getConnection(url, user, password); 23         } catch (SQLException e) { 24             // TODO Auto-generated catch block
25  e.printStackTrace(); 26  } 27         return con; 28  } 29 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM