当前位置:首页 > 后端开发 > com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

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

6个月前 (05-28)39

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 }

 

作者:小奔的早晨
来源链接:https://www.cnblogs.com/syp172654682/p/8379837.html

标签: JDBC

“com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.” 的相关文章

spring下配置tomcat jdbc pool 报找不到"com.mysql.jdbc.Driver"类

初始配置 1 <!--tomcat jdbc pool数据源配置--> 2 <bean id="dataSource" class="org...

从JDBC到commons-dbutils

从JDBC到commons-dbutils

1、前言     玩过Java web的人应该都接触过JDBC,正是有了它,Java程序才能轻松地访问数据库。JDBC很多人都会,但是为什么我还要写它...

spring jdbc 查询结果返回对象、对象列表

首先,需要了解spring jdbc查询时,有三种回调方式来处理查询的结果集。可以参考 使用spring的JdbcTemplate进行查询的三种回调方式的比较,写得还不错。...

综合学生信息管理系统(JSP+JDBC)

综合学生信息管理系统(JSP+JDBC)

原创 通过JSP+JDBC制作一个简单的操作数据库中表信息的系统。 总体界面如下,一共有5个功能块。 功能一:列出全部学生 功能二:按条件...

用Java代码通过JDBC连接Hiveserver2

用Java代码通过JDBC连接Hiveserver2

1.在终端启动hiveserver2#hiveserver2 2.使用beeline连接hive另外打开一个终端,输入如下命令(xavierdb必须是已经存在的数据库)#beeli...

jdbc.properties 文件的配置

jdbc.properties文件的配置   使用配置文件访问数据库的优点是:   一次编写随时调用,数据库类型发生变...

Java Web系列:JDBC 基础

ADO.NET在Java中的对应技术是JDBC,企业库DataAccessApplicationBlock模块在Java中的对应是spring-jdbc模块,EntityFramewor...

Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】

Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言...

Sharding-JDBC介绍

Sharding-JDBC介绍

Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据库分库分表访问。Sharding-JDBC是继dub...

JDBC详解系列(一)之流程

---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- JDBC概述 ----...