① 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();
}
希望對你有用