数据库查询很快,代码查询很慢

直接在客户端上查询速度很快,但是到了代码中速度慢了很多,数据量在100万左右

这是查询代码:

    List<String> result = new ArrayList<>();
    String sql = "SELECT * FROM (SELECT KEYWORDS FROM KEYWORD_PERSONAL_HEAT WHERE USER_ID = '"+userId+"' AND KEYWORDS LIKE '%"+keyword+"%' GROUP BY KEYWORDS ORDER BY max(TIMES) DESC) WHERE ROWNUM <="+rowNum;
    List<Map> searchResult = JdbcUtils.findBySql(this.getEntityManager(), sql);
    for(Map map:searchResult){
        result.add((String) map.get("KEYWORDS"));
    }

这是底层查询代码:

public static List<Map> findBySql(EntityManager entityManager,String sql){
    List<Map> result=new ArrayList<Map>();
    Connection conn=null;
    PreparedStatement pstmt=null;
    ResultSet rs=null;
    try{
        conn=openConn(entityManager);
        pstmt=openPstmt(conn,sql);
        ResultSetMetaData rsmd=pstmt.getMetaData();
        rs=openRs(pstmt);
        while(rs.next()){
            Map data=new HashMap();
            for(int i=1;i<=rsmd.getColumnCount();i++){
                String columnName=rsmd.getColumnName(i);
                data.put(columnName,rs.getObject(columnName));
            }
            result.add(data);
        }
    }catch (SQLException e){
        e.printStackTrace();
    }finally {
        closeConn(rs,pstmt,conn);
    }
    return result;
}
阅读 6.7k
2 个回答

大数据量的一次性全部查询出来本来就很慢.客户端查询快,那是因为一般客户端都是做了分页或者说条数限制的,不知道你用的什么工具,Navicat和DataGrip,pl/sql都是这样的,不过你可以设置一下fetchSize,会有大幅度的提高,但是该慢还是慢 pstmt.setFetchSize(500);,明显是要从业务上做优化,哪有一次性加载100W的需求

重启了一下机器就好了,神奇

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题