文档章节

jdbc的五大常见应用场景

GusFring
 GusFring
发布于 2017/07/23 15:57
字数 982
阅读 28
收藏 0

 

在实际开发工作中,有关于jdbc的应用,经常性地会出现以下五个问题:

 

业务场景一:过滤条件比较弱,一次性可能读出较多记录

增加或修改查询语句来优化查询结果

业务场景二:需要统计的记录比较多

eg.:读取数据库表中所有的记录,千万级的记录的读取可能会出现java的内存溢出异常OutOfMemoryError

原因分析:java程序是运行在java虚拟机中的,jvm是有内存大小限制的,当我们把大量的记录一次性地读入jvm的内存中的时候,读出的数据如果超出了jvm所规定的内存最大值的时候就会出现内存溢出的错误。

解决办法:既然内存容量是有限的,我们可以读取一部分数据进行处理,处理完毕之后在进行下一部分数据的读取,这样避免一次性地载入过多的数据导致内存的溢出。

在jdbc中是如何具体实现的呢?

使用游标:

游标的开启:

需要在加载驱动后,获得与数据库的连接的同时需啊哟啊在url后面加上?useCursorFetch=true

表示我们对这个数据库的读取需要使用游标

要是使用有标的话,必须使用PreparedStatement 的setFetchSize();

入参为int型的整数,表示jdbc从数据库中一次读取记录的数量,需要在查询executeQuery之前需要设置一次查询的记录的数量。

import java.sql.*;

public class Test001 {
	private String driver = "com.mysql.jdbc.Driver";
	private String url = "jdbc:mysql://host:port/dataBaseName";
	private String userName = "xxx";
	private String passWord = "xxx";
	
	public void Test() {
		Connection connection = null;
		String sql = null;
		PreparedStatement prepareStatement = null;
		ResultSet rs = null;
		try {
			//装载驱动
			Class.forName(driver);	
			//获取连接
			connection = DriverManager.getConnection(url,userName,passWord);
			//变更url设置
			url = url + "userCursorFecth = true";
			//sql语句
			sql = "select * from tableName where sex = Female";
			//执行sql语句
			prepareStatement = connection.prepareStatement(sql);
			//设置游标读取参数
			prepareStatement.setFetchSize(1);
			//执行查询语句,返回结果集
			rs = prepareStatement.executeQuery();
			//取结果集
			while(rs.next()) {
				System.out.println(rs.getString(1));
			}
			//此时的执行结果的按照设置的参数进行结果的操作,一条条地处理
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != connection) 
				connection.close();
				if (null != rs) 
					rs.close();
				if (null != prepareStatement)
					prepareStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

 

业务场景三:大对象读取

读取的每一条记录中包含大字段的内容,在实际开发过程中,为了方便管理,往往数据记录会包含大字段的内容,读取可能会出现内存溢出。

处理方式:流方式读取

jdbc的实现:

ResultSet.getBinaryStream()获取流

 


            rs = prepareStatement.executeQuery();
			//取结果集
			while(rs.next()) {
				System.out.println(rs.getString(1));
				
				InputStream in = rs.getBinaryStream(1);
				File file = new File(File_URL);
				OutputStream out = null;
				out = new FileOutputStream(file);
				int temp = 0;
				while ((temp = in.read()) != -1) {
					out.write(temp);
				}
				in.close();
				out.close();
			}

 

业务场景四:大量数据插入

海量的数据插入,如果一条条的插入,每一次的sql语句的发送与接收都需要时间

 

更加高效的使用方式为

批处理:

发送一次sql 插入多条语句

Statement提供了三个接口:

addbatch()

executeBatch()

clearBatch()

遍历需要插入的元素,将其放入batch中,然后执行executeBatch最后执行clearBatch()。

            Set<String> users = new HashSet<String>();  
			String user1 = "zhangsan";
			String user2 = "lisi";
			String  user3 = "zhaowu";	
			users.add(user1);
			users.add(user2);
			users.add(user3);
			
			Statement statement = connection.createStatement();
			String sql2 = "insert into tableName(user)values(";
			for (String user : users) {
				statement.addBatch(sql + user + ")");
			}
			statement.executeBatch();
			statement.clearBatch();

 

业务场景五:字符编码问题

涉及到中文,需要注意可能出现的乱码问题

可以设置不同级别的代码:server级别,database级别,table级别, 字段级别,

优先级依次增大,比如设置列级别的编码,那么其他三个就不会生效。

Server-->Database-->Table-->column

我们需要设置jdbc的编码方式来适应数据库的编码方式,设置方式也很简单,需要在url中增加

例如 :      url = url +"characterEncoding=utf8";

© 著作权归作者所有

GusFring
粉丝 10
博文 33
码字总数 14720
作品 0
南京
程序员
私信 提问
一般JAVA高级工程师的知识深度?

一个Java高级工程师,对jdk重点源码深刻理解,达到如下程度?。 例如为什么Thread里有一个ThreadLocalMap类型的变量 ThreadLocalMap为什么作为ThreadLocal的内部类 ThreadLocalMap的扩缩容机...

trivia
2018/06/05
9.3K
33
Java 200+ 面试题补充 ThreadLocal 模块

让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致。 本文是前文《Java 最常见的 200+ 面试题》的第一个补充模块。 1.ThreadLocal 是什么? ThreadLocal 是一个本...

王磊的博客
03/08
680
0
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
2.4K
0
好程序员Java分享零基础学Java要掌握哪些技能?

  好程序员Java分享零基础学Java要掌握哪些技能?初学者先弄清这些Java的基本概念也是必不可少的,死记硬背肯定是不行的,重在理解,理解它们之间的区别与联系,分别有哪些应用。想想这些代...

好程序员IT
06/26
24
0
编写高性能 Java 代码的最佳实践

摘要:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。以下是译...

这篇文章
2018/06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
12分钟前
1
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
3
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
12
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部