数据库——“该连接已关闭”问题解决方案
问题描述:对数据库的增删改查,出现“该链接已关闭”,发生概论不确定,有时成功,有时失败。
原因: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
数据库——“该连接已关闭”问题解决方案相关推荐
- FTP之‘基础连接已关闭:服务器提交了协议冲突’错误探析
这段时间由于工作的关系,一直研究FTP 服务器/客户端的相关程序,发现了不少问题,有些确实是微软的bug(或者说相关代码不够健壮) . 一.微软IE浏览器作为FTP客户端的bug 上传含中文字符的多级 ...
- MySQL数据库远程连接很慢的解决方案
MySQL数据库远程连接很慢的解决方案 参考文章: (1)MySQL数据库远程连接很慢的解决方案 (2)https://www.cnblogs.com/zsg88/p/9197407.html 备忘一 ...
- 敬业签云便签提示“基础连接已关闭,发送时发生错误”如何解决
部分Windows电脑系统用户在登录敬业签电脑版桌面便签软件时提示错误:The underlying connection was closed:Unable to connect to the re ...
- 敬业签云便签提示“基础连接已关闭,发送时发生错误!”如何解决
部分Windows电脑系统用户在登录敬业签电脑版桌面便签软件时提示错误:The underlying connection was closed:Unable to connect to the re ...
- C#使用request.GetRequestStream() 提示“底层连接已关闭:发送时发生意外错误”的问题
在使用HttpWebRequest的实例request请求网址时,在调用request.GetRequestStream()时提示 "底层连接已关闭:发送时发生意外错误"的问题 论 ...
- HttpWebRequest 提示 “基础连接已关闭:发送时发生意外错误” 的解决方法
HttpWebRequest 多次请求不同网站时,由于安全协议问题.提示错误 "The underlying connection was closed: An unexpected err ...
- 基础连接已关闭解决办法
最近微信公众号功能莫名其妙的出问题,在调腾讯和百度接口就出问题,也不知道哪里抽风,只要调用外部接口,POST或者GET提交,准备出错.提示基础连接已关闭...... httpWebRequest请求错 ...
- sybase jz0c0 连接已关闭_Go 基于 channel 实现连接池
golang的channel除了goroutine通信之外还有很多其他的功能,本文将实现一种基于channel的通用连接池. 何为通用? 连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用 ...
- C# WebRequest 基础连接已关闭 连接意外关闭
1. 出现这种问题一般是因为request和response没有释放造成的,在请求处理完毕对请求request调用abort,对response调用close处理一下就好了. 2.我自己试的是这种: ...
- 基础连接已关闭解决办法_手机wifi连不上怎么办 手机wifi连不上解决办法【详解】...
现在WLAN局域网无处不在,我们几乎都是生活在WiFi的世界里,其中使用手机连接WLAN局域网是最常见.最便携的方式.如果手机wifi连不上,这是一件比较让人抓狂的事.下面小编就给大家总结了手机wif ...
最新文章
- php 修改 title,WordPress通过functions.php修改meta title样式
- R3获取kernel32地址
- CUDA系列学习(五)GPU基础算法: Reduce, Scan, Histogram
- Python3爬虫知识点总结
- kubeadm加载k8s镜像实现集群搭建
- toArray()方法使用说明
- portal for arcgis 10.4的安装和配置及遇到的问题
- python拼接两个数组_在Python中连接两个数组
- RS485光纤中继器有哪些优缺点?
- postfix报错postfix: fatal: parameter inet_interfaces: no local interface found for ::1
- python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...
- 银行业务队列简单模拟(队列queue)
- 计算机二级c语言2010,全国计算机二级c语言2010历年真题及答案.doc
- php两个时间月数,PHP获得两个日期之间的月数
- Android : First step – Download and build
- Top的VIRT是什么
- 20个最强的基于浏览器的在线代码编辑器
- 七款经典4.2v锂电池充电电路图详解 - 全文
- 特斯拉国产又怎样,十个月后就完蛋
- 个人面经整理海尔测试
热门文章
- 云计算 雾计算 边缘计算的区别
- Instantiation of Chaincode using Fabric Node manifest for hyperledger/fabric-ccenv:latest not found
- 创建phpinfo.php
- tcpdf html 格式重叠,使用TCPDF进行HTML呈现(PHP)
- CNN(卷积神经网络)
- JDBC11 封装+资源配置文件管理
- Debian Ubuntu/Centos7设置某些软件不自动更新
- Spring Boot 2.0.3 修改 Servlet 容器(服务器)配置
- iOS 自定义底部tabbar加号按钮实现方法
- ningx访问日志切割