① mybatis大数据查询优化:fetchSize
这两天做到一个需求,需要一次性将一张数据表里的所有资源数据中的位置信息录入到redis中,表中的数据有几百万起步,采用的是java定时任务,循环每次查出一万条数据存入redis,测试时发现插入效率非常慢,经过排查发现是通过mybatis查询数据的耗时超过了总耗时的99%,我这台机器上是每查询一万条数据返回耗时87s左右。
解决方法:
在mapper.xml中的<select>中加入fetchSize参数,设置的大一些,如下:
我也是第一次用这个参数,这效果,感觉非常神奇!
简单参数解析:
通过JDBC取数据时,默认是10条数据取一次,即fetch size为10(根据oracle的文档,默认的fetchSize是10),如果增大这个数字可以减少客户端与oracle的往返,减少响应时间,网上有建议这个数字不要超过100,要不然对中间件内存消耗大。
虽然说超过100不好,但是我设置了10000,结果看我的破电脑还是扛得住的,但是本着专研精神,我将fatch size设置为1000,看看效果会不会打折扣,结果用时如下:
总结:
在使用mybatis一次查询大量数据时确实可以通过怎大fatchSize的值来大大提高查询效率,使用也非常简单,具体fatchSize设为多少要根据自己具体的业务需要和机器的配置来综合判定。
待解决问题
以上方式在xml中可以轻松设置,但是使用mybatis-plus的简单查询时并不用手动写xml查询,我也不知道如何定制其fatchSize的值,我目前的解决方式是手动在xml中再写一个查询方法来调用,但是感觉这样做非常的麻烦,如果你知道如何在调用mybatis-plus的BaseMapper查询方法时配置fatchSize,请留言告知,十分感谢!
② java代码使用spring的jdbctemplate查询大数据量时速度特别慢,该如何解决呢
第一,不要用*,第二,建议分页,因为数据太大,读到内存里也麻烦
③ JDBC查数据库数据量问题
String
sql
=
"select
count(*)
from
news_detail"
----count(*)是数据库内置函数,就是表news_detail总共有几行
Result
rs
=
this.executeSQL(sql,params);执行上面这句sql语句,返回查询结果类ResultSet
totalCount
=
rs.getInt(1);查询结果集里获取第一列的数据,就是count(*)函数查询结果,也就是这张表的数据量
纯手打,应该差不多就这样吧
④ Java JDBC数据库查询表和字段
可以用下面的方式获取,把tableName换成你的表名,有些数据库也可以直接使用Sql查询表列名
ResultSet resultSet = statement.executeQuery("select * from tableName");
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
for(int i=0; i<resultSetMetaData.getColumnCount(); i++) {
System.out.print( resultSetMetaData.getColumnLabel(i) + "\t" );
System.out.print( resultSetMetaData.getColumnName(i) + "\t" );
System.out.println( resultSetMetaData.getColumnTypeName(i) );
}
⑤ 简述使用Jdbc实现数据查询的完整步骤
创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现。
⑥ 怎样利用JDBC获得连接,查询数据,获取查询的数据
Java中有个元数据,交MetaData,这个是记录数据库和表本身信息的信息,
ResultSet rs=st.executeQuery("select * from student2");
//获取结果集元数据
ResultSetMetaData rsmd=rs.getMetaData();
//总列数
int size=rsmd.getColumnCount();
//打印列名
for(int i=1;i<=size;i++)
{System.out.print(rsmd.getColumnName(i)+"\t");
}
System.out.println();
//打印列在数据库中的类型
for(int i=1;i<=size;i++)
{
System.out.print(rsmd.getColumnTypeName(i)+"\t");
}
System.out.println();
//打印列的类型大小
for(int i=1;i<=size;i++)
{
System.out.print(rsmd.getColumnDisplaySize(i)+"\t");
}
System.out.println();
//别名
for(int i=1;i<=size;i++)
{
System.out.print(rsmd.getColumnLabel(i)+"\t");
}
System.out.println();
//打印结果集中数据
while(rs.next())
{
for(int i=1;i<=size;i++)
{
System.out.print(rs.getString(i)+"\t");
}
System.out.println();
}
希望对你有用