问题描述:对数据库的增删改查,出现“该链接已关闭”,发生概论不确定,有时成功,有时失败。

原因:Connection 是线程不安全的,当将Connection设置为全局变量,若有一个线程正将该连接close,而另一线程正在访问,则会出现“该链接已关闭”的错误。

解决方案:将Connection设置为局部变量,或每次调用时从新开一个连接。(若嫌速度慢,可以考虑使用连接池)。

修改后的代码:

package common.DaoImplement;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;import common.DaoInterface.IConnectionDatabase;
import common.tool.ReaderXmlConfig;public class ConDatabaseBySqlServerImp implements IConnectionDatabase
{private String driver;private String url;private String username;private String password;private Connection con = null;private Statement st = null;ResultSet rs  = null;/*** 通过读取配置文件初始化参数* ReaderXmlConfig,这是一个单例的类,用于得到Config.xml配置文件*/public void initialize(){Document doc = ReaderXmlConfig.getInstance();NodeList dbs = doc.getElementsByTagName("db");Element db = (Element)dbs.item(0);String driver = db.getElementsByTagName("driver").item(0).getFirstChild().getNodeValue();String url = db.getElementsByTagName("url").item(0).getFirstChild().getNodeValue();String username = db.getElementsByTagName("username").item(0).getFirstChild().getNodeValue();String password = db.getElementsByTagName("password").item(0).getFirstChild().getNodeValue();this.driver = driver;this.url = url;this.username = username;this.password = password;}/*** 构造方法* 加载数据库*/public ConDatabaseBySqlServerImp(){initialize();try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}/***对外提高Connection的接口*在此没有直接使用上面定义的con,而是重新定义了一个conn,即每次外部调用getConnection()方法,都将返回一个新的连接(注意在使用后关闭)*若此处直接是使用con,可能导致多线程并发访问,导致出错。*/@Overridepublic  Connection getConnection() {Connection conn = null;try {conn = DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 用于内部的使用*/private void getCon(){if(con == null){try {con = DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();}}}/*** 执行查询*/@Overridepublic ResultSet executeSql(String sql) {getCon();try {st = con.createStatement();rs = st.executeQuery(sql);} catch (SQLException e) {e.printStackTrace();}return rs;}/*** 执行删除,修改等无返回值的语句*/@Overridepublic Boolean executeUpdate(String sql) {getCon();try {st = con.createStatement();st.executeUpdate(sql);            } catch (SQLException e) {e.printStackTrace();return false;}return true;}/*** 关闭连接*/@Overridepublic void closeConnection() {try{if(rs != null){rs.close();rs = null;}if(st != null){st.close();st = null;}if(con != null){con.close();con = null;}}catch(SQLException e){e.printStackTrace();}}}

转载于:https://www.cnblogs.com/ITinfo/p/3462782.html

数据库——“该连接已关闭”问题解决方案相关推荐

  1. FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析

    这段时间由于工作的关系,一直研究FTP 服务器/客户端的相关程序,发现了不少问题,有些确实是微软的bug(或者说相关代码不够健壮) . 一.微软IE浏览器作为FTP客户端的bug 上传含中文字符的多级 ...

  2. MySQL数据库远程连接很慢的解决方案

    MySQL数据库远程连接很慢的解决方案 参考文章: (1)MySQL数据库远程连接很慢的解决方案 (2)https://www.cnblogs.com/zsg88/p/9197407.html 备忘一 ...

  3. 敬业签云便签提示“基础连接已关闭,发送时发生错误”如何解决

    部分Windows电脑系统用户在登录敬业签电脑版桌面便签软件时提示错误:The underlying connection was closed:Unable to connect to the re ...

  4. 敬业签云便签提示“基础连接已关闭,发送时发生错误!”如何解决

    部分Windows电脑系统用户在登录敬业签电脑版桌面便签软件时提示错误:The underlying connection was closed:Unable to connect to the re ...

  5. C#使用request.GetRequestStream() 提示“底层连接已关闭:发送时发生意外错误”的问题

    在使用HttpWebRequest的实例request请求网址时,在调用request.GetRequestStream()时提示 "底层连接已关闭:发送时发生意外错误"的问题 论 ...

  6. HttpWebRequest 提示 “基础连接已关闭:发送时发生意外错误” 的解决方法

    HttpWebRequest 多次请求不同网站时,由于安全协议问题.提示错误 "The underlying connection was closed: An unexpected err ...

  7. 基础连接已关闭解决办法

    最近微信公众号功能莫名其妙的出问题,在调腾讯和百度接口就出问题,也不知道哪里抽风,只要调用外部接口,POST或者GET提交,准备出错.提示基础连接已关闭...... httpWebRequest请求错 ...

  8. sybase jz0c0 连接已关闭_Go 基于 channel 实现连接池

    golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池. 何为通用? 连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用 ...

  9. C# WebRequest 基础连接已关闭 连接意外关闭

    1. 出现这种问题一般是因为request和response没有释放造成的,在请求处理完毕对请求request调用abort,对response调用close处理一下就好了. 2.我自己试的是这种: ...

  10. 基础连接已关闭解决办法_手机wifi连不上怎么办 手机wifi连不上解决办法【详解】...

    现在WLAN局域网无处不在,我们几乎都是生活在WiFi的世界里,其中使用手机连接WLAN局域网是最常见.最便携的方式.如果手机wifi连不上,这是一件比较让人抓狂的事.下面小编就给大家总结了手机wif ...

最新文章

  1. php 修改 title,WordPress通过functions.php修改meta title样式
  2. R3获取kernel32地址
  3. CUDA系列学习(五)GPU基础算法: Reduce, Scan, Histogram
  4. Python3爬虫知识点总结
  5. kubeadm加载k8s镜像实现集群搭建
  6. toArray()方法使用说明
  7. portal for arcgis 10.4的安装和配置及遇到的问题
  8. python拼接两个数组_在Python中连接两个数组
  9. RS485光纤中继器有哪些优缺点?
  10. postfix报错postfix: fatal: parameter inet_interfaces: no local interface found for ::1
  11. python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...
  12. 银行业务队列简单模拟(队列queue)
  13. 计算机二级c语言2010,全国计算机二级c语言2010历年真题及答案.doc
  14. php两个时间月数,PHP获得两个日期之间的月数
  15. Android : First step – Download and build
  16. Top的VIRT是什么
  17. 20个最强的基于浏览器的在线代码编辑器
  18. 七款经典4.2v锂电池充电电路图详解 - 全文
  19. 特斯拉国产又怎样,十个月后就完蛋
  20. 个人面经整理海尔测试

热门文章

  1. 云计算 雾计算 边缘计算的区别
  2. Instantiation of Chaincode using Fabric Node manifest for hyperledger/fabric-ccenv:latest not found
  3. 创建phpinfo.php
  4. tcpdf html 格式重叠,使用TCPDF进行HTML呈现(PHP)
  5. CNN(卷积神经网络)
  6. JDBC11 封装+资源配置文件管理
  7. Debian Ubuntu/Centos7设置某些软件不自动更新
  8. Spring Boot 2.0.3 修改 Servlet 容器(服务器)配置
  9. iOS 自定义底部tabbar加号按钮实现方法
  10. ningx访问日志切割