文档章节

由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模块将其关闭,以免发生不必要的问题。


© 著作权归作者所有

共有 人打赏支持
艳沐石
粉丝 2
博文 43
码字总数 23765
作品 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
预示敏捷方法走偏的15个标志——第1部分

【编者按】误解和“最佳实践”可能会让你的团队原地打转,无法高效产出代码。本文主要介绍预示着敏捷方法走偏的15个标志,作者为 Steven A. Lowe。文章系国内 [ITOM][1] 管理平台 [OneAPM][2...

OneAPM蓝海讯通
2016/06/16
19
0
浅谈软件项目规模估计——怎么估?

做事所花费的时间总是比你预期的要长,即使你的预期中考虑了侯世达定律。 —— 侯世达,哥德尔、埃舍尔、巴赫 侯世达 周三的下午,我像平常一样,写着代码听着歌,突然从天而降一份莫名其妙...

ThoughtWorks中国
2017/12/04
0
0
AI写的科幻小说,人们会喜欢看么?

  半个月前,一则消息在哈利波特迷中炸锅,已经终结的《哈利波特》系列又出新章节了!不过作者可不是J.K.罗琳,而是Botnik Studio的AI机器人。至于好不好看,有的人说文风一言难尽,有的则拍...

中国机器人
2017/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

oracle 安装 PL/SQL Developer连接64位Oracle免安装配置

PL/SQL Developer连接64位Oracle 在64位系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其...

PeakFang-BOK
23分钟前
3
0
裁员寒冬袭来,30岁还在CRUD的Java程序员,拿什么安身立命?

就在近日,智联招聘公布的数据更是侧面印证了很多公司“瘦身”的事实:“2018年第二季度,小微企业用人需求较第一季度平均下降26.6%”。 裁员大潮正滚滚向前,席卷各行各业! 你做好失业的准...

Java填坑之路
25分钟前
4
0
第一章:什么是SpringCloud

第一章:什么是SpringCloud 何为微服务 在了解 SpringCloud之前,我们先来大致了解下 微服务这个概念吧。 传统单体架构 单体架构在小微企业比较常见,典型代表就是一个应用、一个数据库、一个...

DemonsI
31分钟前
8
0
环境搭建之八-- node.js和npm

1.node.js官网下载64位二进制压缩包 node-v8.12.0-linux-x64.tar.xz 2.解压文件 2.1 xz格式文件为 tar格式 xz -d node-v8.12.0-linux-x64.tar.xz 此时文件已经转变为 node-v8.12.0-linux-x64...

imbiao
35分钟前
4
0
JVM调优浅谈

1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型。 基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值。 “引用值”代表了某个对象的...

xtof
39分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部