JDBC处理几种常见的业务场景

JDBC诞生的背景,应用程序通过调用统一的接口可以实现对任意数据库的访问。
一次读取大量数据、读取数据库表中所有的数据
数据库一次性读取大量记录可能会导致java内存溢出异常。读出的数据超过jvm内存大小限制,则会出现内存溢出异常。
解决方法:通过游标分批次将数据读入到内存中进行处理。(游标提供了一种客户端读取部分服务器端返回结果集的机制)。
那如何使用它呢?

  1. 开启游标DB_URL:jdbc:mysql(根据个人使用数据库而定):数据库服务器地址:数据库服务端口/库名?useCursorFetch=true。
  2. 通过PreparedStatement 的setFetchSize(2) 设置每次从结果集中获取2条记录。

读取数据库表中大字段
数据库即使读取一条记录已有可能超过JVM的内存。
通过以二进制流的方式,分段读取大字段中的内容,待前一段处理完之后,再继续读取接下来的内容。示例如下

InputStream is = resultSet.getBinaryStream(“字段名”); // 以流的形式读取指定大字段数据。
// 将对象流写入文件,边读边写
File file = new File(url);
OutputStream out = new OutputStream()
int temp = 0;
while((temp = in.read)!=-1){
out.write(temp);
}
一次性存储多条数据
通过“批处理”的方式,一次执行多条SQL;
statement 有三个方法: addBatch(sql);executeBatch();clearBatch();

假装是分界线
数据库连接池
因为创建数据库连接需要4次网络连接,建立连接时间开销很大,如果多个用户访问软件时,会造成响应时间慢等问题。
数据库服务器本身并不能无限制的创建连接,当多个线程访问数据库超出了服务器的最大可分配资源时,就会报toManyConnections的异常,造成服务器宕机。
解决方法:
通过连接池管理数据库连接,每个需要访问数据库的线程,从连接池找中租借一个连接,使用完毕之后归还连接,供下一个线程使用。
//创建数据库连接池
BasicDataSource ds = new BasicDataSource;
ds.setUrl();
ds.setDirverClassName()
ds.setUserName();
ds.setPassWord();
// 连接池高级配置
setInitialSize()设置初始化连接数
setMaxTotal() 设置最大连接数
setMaxWaitMillis() 设置线程最大等待时间
setMaxIdle() 设置最大空闲连接数,减少不必要资源损耗
setMinIdle()设置最小空闲连接数

DBCP的定期检查
为保证连接池中的连接都是有效的,我们会对连接池作一个定期的检查。
setTestWhileIdle(True) 开启定期检查‘
setMinEvictableTimeMillis(); 设置销毁连接的最小空闲时间。
setTimeBetweenEvictableTimeMillis(); 检查运行时间的间隔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值