文档章节

由close引发的故事

艳沐石
 艳沐石
发布于 2014/06/04 14:42
字数 765
阅读 12
收藏 0

最近在写一些多线程的任务,有时候任务处理多起来,一些不好的编程毛病就变得恐惧起来。

1. 采用框架,在读取信息时候有些慢,于是我用原生jdbc来完成的。代码如下:


public List<String> getIsbns(int offset, int size) {
		try {
			Connection con = dataSource.getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery("select pisbn from amazon_book where flag is null limit " + offset + ", " + size);
			List<String> list = new ArrayList<String>(size);
			while (rs.next()) {
				list.add(rs.getString(1));
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}



由于,我没有及时的关闭Connection,导致程序在运行不久后出现了问题。


情况描述:
1. 采用直连方式,每次都需要创建连接,而连接又未释放,导致保持过多数据库连接资源,数据查询结果响应降低。
2. 采用数据库连接池方式,由于没有及时释放资源,导致数据库连接池达到最大的时候,使得其他数据库请求等待,导致数据库访问有一种静默的样子。

查看java.sql.Connection源码,发现有如下注释


/**
     * Releases this <code>Connection</code> object's database and JDBC resources
     * immediately instead of waiting for them to be automatically released.
     * <P>
     * Calling the method <code>close</code> on a <code>Connection</code>
     * object that is already closed is a no-op.
     * <P>
     * It is <b>strongly recommended</b> that an application explicitly
     * commits or rolls back an active transaction prior to calling the
     * <code>close</code> method.  If the <code>close</code> method is called
     * and there is an active transaction, the results are implementation-defined.
     * <P>
     *
     * @exception SQLException SQLException if a database access error occurs
     */
    void close() throws SQLException;



【我们应该手动释放不应用的资源,而不是等待被自动回收】,如果资源被消耗殆尽,只能等待虚拟机自己去回收了,这样的程序不是高效的。



2. 在字符写入文件时候,对于OutputStream没有及时close

try {
		File f = new File(bookFolder + "page.html");
		System.out.println(f.getPath());
		if (!f.getParentFile().exists()) {
			f.getParentFile().mkdirs();
		}
		if (!f.exists()) f.createNewFile();
		IOUtils.copy(new ByteArrayInputStream(doc.toString().getBytes()), new FileOutputStream(f));
	} catch (Exception e) {
		throw new RuntimeException(e.getMessage(), e);
	}



原因:  
操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候.因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏.

解决:
尽量把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄.
java的垃圾回收不能关闭网络连接打开的文件句柄,如果没有执行close()(例如:java.net.Socket.close())则文件句柄将一直存在,而不能被关闭.你也可以考虑设置socket的最大打开数来控制这个问题.

所以养成良好的编码习惯,在对数据库访问,文件操作完毕后,通过finally模块将其关闭,以免发生不必要的问题。


© 著作权归作者所有

共有 人打赏支持
艳沐石
粉丝 3
博文 44
码字总数 24301
作品 0
大兴
程序员
私信 提问
2018-11-10-今日得到-《连接》

今天分享的主题来自得到的每天听本书系列之《连接》 关于作者 戴维·埃文斯,经济学家、商业顾问和企业家。他对多边平台新经济学进行了开创性的研究,也为世界上许多的多边平台企业提供咨询服...

韬声依旧在路上
2018/11/10
0
0
《中国合伙人2》人物原型之一竟是他!Are you ok?

文 | TechWeb 昨天,电影《中国合伙人2》发布了定档版海报,这部电影将于12月18日上映。在片名上似乎与上一部《中国合伙人》一脉相承,但这一次是全新的故事情节,主要讲的是互联网人追求梦想...

比特网
2018/11/22
0
0
《人之彼岸》书评|你也担忧人工智能吗?

郝景芳说,“人之彼岸”的意思很简单,人在此岸,AI在彼岸,对彼岸的遥望让我们观照此案。那么,假设我们到达了彼岸,人工智能时代,会发生什么样的故事呢? 人工智能一直是热度很高的话题,...

miss棋落
2017/12/12
0
0
java socket 注意的地方

关于 socket的关闭,有3种方法可以关闭socket连接 socket.close() socket.getOutputStream().close() #socket关闭后调用该方法会抛异常 socket.getInputStream().close() #socket关闭后调用该...

疯狂的骑士
2015/08/12
0
0
Redis 2.4 backgroud thread

Redis 终于在2.4版本里引入了除主线程之外的后台线程,这个事情由来已久.早在2010年2月就有人提出 aof的缺陷,提及的问题主要有: 1 主线程aof的每次fsync(everysecond模式)在高并发下时常出现1...

红薯
2011/10/31
888
0

没有更多内容

加载失败,请刷新页面

加载更多

词法分析器flex教程

词法分析器flex教程 flex是基于正则表达式,用于对字符串进行提取和分析的工具。一般情况下,flex常用语编译器前端的词法分析阶段。flex程序读取用户输入的词法单元描述文件,生成lex.yy.c文...

陶小陶
10分钟前
1
0
IntelliJ IDEA 社区版没有 Spring Initializr

RT 解决办法 打开文件 - 设置 - 插件 输入 Spring 找到插件 Spring Assistant 并安装 下载可能会需要一点点时间 . 重启 IDEA 后,新建项目就可以看见 Spring Assistant 选项了...

taadis
12分钟前
0
0
MySQL执行计划 type类型

MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可。 explain select * from t_settlement_settle_order_detail where id = 2; 下面来介绍各个字段: type:连接类型......

ChyiHuang
16分钟前
0
0
mysql遇到的坑

sql_mode=NO_ENGINE_SUBSTITUTION 今天在测试库上发现使用GROUP BY 报错,我使用的mysql5.7 ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,没...

事儿爹
27分钟前
1
0
聊聊flink的InternalTimeServiceManager

序 本文主要研究一下flink的InternalTimeServiceManager InternalTimeServiceManager flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/operators/InternalTim......

go4it
39分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部