Redis查询&JDBC查询&Hibernate查询方式的效率比较...
2016-08-31 19:37
357 查看
比较三种查询方式查询效率对比...我是用的JavaWeb的方式通过通过JSP页面查询的填写查询的参数...给予反馈....
整个demo的下载地址:http://files.cnblogs.com/files/DreamDrive/redis2sql.rar
1.后台对应的表结构:
创建表的SQL语句:
搞了一个简易的JSP页面用来传参:
附主要代码:
主servlet接受参数,调用各种不同的查询方式:
RedisSqlSearchServlet.java
Redis查询:
JedisSearchUtil.java
JDBC查询方式:
其余代码省略........
最需要总结的是Reids中的参数不确定下的查询集合交集的方式和JDBC查询条件下查询参数不确定的查询方式...
sinter中传入的可以是一个动态的参数.....动态的参数本质上是数组.
关于动态数组的总结博客:
其次是JDBC动态接受参数个数的方式:
整个demo的下载地址:http://files.cnblogs.com/files/DreamDrive/redis2sql.rar
1.后台对应的表结构:
创建表的SQL语句:
CREATE TABLE `asset` ( `assetid` int(100) NOT NULL AUTO_INCREMENT, `assetname` varchar(100) DEFAULT NULL, `region` varchar(50) DEFAULT NULL, `programtype` varchar(50) DEFAULT NULL, `releasetime` varchar(100) DEFAULT NULL, `director` varchar(50) DEFAULT NULL, `actor` varchar(500) DEFAULT NULL, `screenwriter` varchar(50) DEFAULT NULL, `language` varchar(50) DEFAULT NULL, `duration` varchar(50) DEFAULT NULL, `alias` varchar(255) DEFAULT NULL, PRIMARY KEY (`assetid`) ) ENGINE=InnoDB AUTO_INCREMENT=579430 DEFAULT CHARSET=utf8
搞了一个简易的JSP页面用来传参:
附主要代码:
主servlet接受参数,调用各种不同的查询方式:
RedisSqlSearchServlet.java
import java.io.IOException; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 测试Redis和JDBC查询效率 * @author CDV-DX7 * */ public class RedisSqlSearchServlet extends HttpServlet { private String redisSearchResult; private String jdbcSerachResult; private String hibernateSerachResult; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 1.接收参数 */ request.setCharacterEncoding("UTF-8"); // 1.接收参数 Map<String,String[]> searchParaMap = request.getParameterMap(); String[] searchtypeArr = searchParaMap.get("searchtype"); String[] assetnameArr = searchParaMap.get("assetname"); String[] directorArr = searchParaMap.get("director"); String[] screenwriterArr = searchParaMap.get("screenwriter"); String[] actorArr = searchParaMap.get("actor"); String[] programtypeArr = searchParaMap.get("programtype"); String[] regionArr = searchParaMap.get("region"); String[] languageArr = searchParaMap.get("language"); String searchtype = ""; String assetname = ""; String director = ""; String screenwriter = ""; String actor = ""; String programtype = ""; String region = ""; String language = ""; if (searchtypeArr!= null){ searchtype = searchtypeArr[0]; } if (assetnameArr!= null){ assetname = assetnameArr[0]; } if (directorArr!= null){ director = directorArr[0]; } if (screenwriterArr!= null){ screenwriter = screenwriterArr[0]; } if (actorArr!= null){ actor = actorArr[0]; } if (programtypeArr!= null){ programtype = programtypeArr[0]; } if (regionArr!= null){ region = regionArr[0]; } if (languageArr!= null){ language = languageArr[0]; } HttpSession session = request.getSession(); if("Redis查询".equals(searchtype)){ redisSearchResult = JedisSearchUtil.redisSearch(assetname, director, actor, screenwriter, region, language, programtype); session.setAttribute("searchResult", redisSearchResult); }else if("JDBC查询Mysql".equals(searchtype)){ jdbcSerachResult = JdbcSqlSearchUtil.jdbcSerach(assetname, director, actor, screenwriter, region, language, programtype); session.setAttribute("searchResult", jdbcSerachResult); }else if("Hibernate查询Mysql".equals(searchtype)){ hibernateSerachResult = HibernateSearchUtil.hibernateSerach(assetname, director, actor, screenwriter, region, language, programtype); session.setAttribute("searchResult", hibernateSerachResult); } response.sendRedirect(request.getContextPath()+"/searchResult.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Redis查询:
JedisSearchUtil.java
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import redis.clients.jedis.Jedis; public class JedisSearchUtil { public static String redisSearch(String assetname,String director,String actor, String screenwriter,String region,String language,String programtype){ Jedis jedis = RedisUtil.getJedis(); //0------50万 //1------100万 jedis.select(1); //2------500万 //3------1000万 try{ String assetnameKey = ""; String screenwriterKey = ""; String actorKey = ""; String programtypeKey = ""; String regionKey = ""; String languageKey = ""; String directorKey = ""; List<String> keysList = new ArrayList<String>(); if(assetname != null && assetname != ""){ assetnameKey = "asset:assetname:"+ assetname; keysList.add(assetnameKey); } if(screenwriter != null && screenwriter != ""){ screenwriterKey = "asset:screenwriter:"+ screenwriter; keysList.add(screenwriterKey); } if(actor != null && actor != ""){ actorKey = "asset:actor:"+ actor; keysList.add(actorKey); } if(programtype != null && programtype != ""){ programtypeKey = "asset:programtype:"+ programtype; keysList.add(programtypeKey); } if(region != null && region != ""){ regionKey = "asset:region:"+ region; keysList.add(regionKey); } if(language != null && language != ""){ languageKey = "asset:language:"+ language; keysList.add(languageKey); } if(director != null && director != ""){ directorKey = "asset:director:"+ director; keysList.add(directorKey); } long start = System.currentTimeMillis(); int keysListSize = keysList.size(); String [] convertKeysArr = (String[])keysList.toArray(new String[keysListSize]); Set<String> sinterIds = jedis.sinter(convertKeysArr); long findIdsEnd = System.currentTimeMillis(); Map<String, String> asset = new HashMap<String, String>(); // String actor = ""; // String director = ""; // String screenwriter = ""; // String region = ""; // String programtype = ""; // String alias = ""; long loopbegin = System.currentTimeMillis(); for (String assetid : sinterIds) { // long start1 = System.currentTimeMillis(); asset = jedis.hgetAll("asset:"+assetid); // long start11 = System.currentTimeMillis(); //System.out.println("Redis中取到hash值用时"+(start11-start1)); asset.get("actor"); asset.get("director"); asset.get("screenwriter"); asset.get("region"); asset.get("programtype"); asset.get("language"); //alias = asset.get("alias"); //System.out.println("主演:"+actor+",导演:"+director+",编剧:"+screenwriter+",地区:"+region+",节目类型:"+programtype+",别名"+alias); } long loopend = System.currentTimeMillis(); //Reids中共有"+Long.valueOf(jedis.dbSize())+"条键值对;"+"\n String redisSearchResult = "Redis找到符合条件的id集合用时:"+(findIdsEnd-start)+ "毫秒;\nRedis再遍历符合条件id集合使用时间:"+(loopend-loopbegin)+"毫秒;\nRedis总共花费时间:"+(loopend-start)+ "毫秒;\nRedis共查询出"+sinterIds.size()+"个记录;"; return redisSearchResult; }finally{ RedisUtil.returnRedis(jedis); } } }
JDBC查询方式:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; /** * JDBC查询Mysql数据库并返回查询结果(查询花费的时间,查询到多少条数) * @author CDV-DX7 * */ public class JdbcSqlSearchUtil { public static void main(String[] args) { System.out.println(jdbcSerach("","冯小刚","葛优","顾晓阳","中国大陆","汉语普通话","喜剧")); } public static String jdbcSerach(String assetname,String director,String actor, String screenwriter,String region,String language,String programtype){ Connection connection = null; PreparedStatement preparedStatement = null; //static Statement statement2 = null;//用来统计数据库中的总记录数 ResultSet resultSet = null; try { long start = System.currentTimeMillis(); //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //通过驱动管理类获取数据库链接 //50万数据对应的连接 //connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "root"); //100万数据对应的连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/1million?characterEncoding=utf-8", "root", "root"); //查询数据库中的总记录数 String allRecordSql = "select count(*) from asset"; Map<String,Integer> countMap = new HashMap<String,Integer>(); //定义sql语句 ?表示占位符 StringBuilder sql = new StringBuilder(); sql.append("select * from asset where "); if(assetname != null && assetname != ""){ sql.append(" assetname like ?"); countMap.put(assetname,countMap.size()+1); } if(director != null && director != ""){ if(countMap.size() < 1){ sql.append(" director like ?"); }else{ sql.append(" and director like ?"); } countMap.put(director,countMap.size()+1); } if(programtype != null && programtype != ""){ if(countMap.size() < 1){ sql.append(" programtype like ?"); }else{ sql.append(" and programtype like ?"); } countMap.put(programtype,countMap.size()+1); } if(actor != null && actor != ""){ if(countMap.size() < 1){ sql.append(" actor like ?"); }else{ sql.append(" and actor like ?"); } countMap.put(actor,countMap.size()+1); } if(screenwriter != null && screenwriter != ""){ if(countMap.size() < 1){ sql.append(" screenwriter like ?"); }else{ sql.append(" and screenwriter like ?"); } countMap.put(screenwriter,countMap.size()+1); } if(region != null && region != ""){ if(countMap.size() < 1){ sql.append(" region like ?"); }else{ sql.append(" and region like ?"); } countMap.put(region,countMap.size()+1); } if(language != null && language != ""){ if(countMap.size() < 1){ sql.append(" language like ?"); }else{ sql.append(" and language like ?"); } countMap.put(language,countMap.size()+1); } // StringBuilder sql = "select * from asset where assetname like ? and director like ? and programtype like ? " + // "and actor like ? and screenwriter like ? and region like ? and language like ? "; //获取预处理statement preparedStatement = connection.prepareStatement(sql.toString()); //statement2 = connection.createStatement(); //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值 if(assetname != null && assetname != ""){ preparedStatement.setString(countMap.get(assetname), "%"+assetname+"%"); //preparedStatement.setString(countMap.get(assetname), assetname); } if(director != null && director != ""){ preparedStatement.setString(countMap.get(director), "%"+director+"%"); //preparedStatement.setString(countMap.get(director),director); } if(programtype != null && programtype != ""){ preparedStatement.setString(countMap.get(programtype), "%"+programtype+"%"); //preparedStatement.setString(countMap.get(programtype), programtype); } if(actor != null && actor != ""){ preparedStatement.setString(countMap.get(actor), "%"+actor+"%"); //preparedStatement.setString(countMap.get(actor), actor); } if(screenwriter != null && screenwriter != ""){ preparedStatement.setString(countMap.get(screenwriter), "%"+screenwriter+"%"); //preparedStatement.setString(countMap.get(screenwriter), screenwriter); } if(region != null && region != ""){ preparedStatement.setString(countMap.get(region), "%"+region+"%"); //preparedStatement.setString(countMap.get(region), region); } if(language != null && language != ""){ preparedStatement.setString(countMap.get(language), "%"+language+"%"); //preparedStatement.setString(countMap.get(language), language); } long searchend = System.currentTimeMillis(); //向数据库发出sql执行查询,查询出结果集 resultSet = preparedStatement.executeQuery(); //resultSet2 = statement2.executeQuery(allRecordSql); //遍历查询结果集 long loopstart = System.currentTimeMillis(); int i=0; while(resultSet.next()){ i++; resultSet.getString("director"); resultSet.getString("actor"); resultSet.getString("programtype"); resultSet.getString("screenwriter"); resultSet.getString("region"); resultSet.getString("language"); //System.out.println(resultSet.getString("director")+" "+resultSet.getString("actor")+" "+resultSet.getString("programtype")+" "+resultSet.getString("screenwriter") // +" "+resultSet.getString("region")+" "+resultSet.getString("language")+" "+resultSet.getString("alias")); } long loopend = System.currentTimeMillis(); String searchResult = "JDBC找到这些数据用时:"+ (searchend-start)+"毫秒;\nJDBC对结果循环遍历耗时时:"+(loopend-loopstart) +"毫秒;\nJDBC共耗时:"+(loopend-start)+"毫秒;\nJDBC共查找到"+i+"个记录"; return searchResult; } catch (Exception e) { e.printStackTrace(); }finally{ //释放资源 if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(preparedStatement!=null){ try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return "-----"; } }
其余代码省略........
最需要总结的是Reids中的参数不确定下的查询集合交集的方式和JDBC查询条件下查询参数不确定的查询方式...
List<String> keysList = new ArrayList<String>();//用一个List来接收前台参来的查询参数 keysList.add(screenwriterKey); .......................... int keysListSize = keysList.size();//得到共有多查询参数 String [] convertKeysArr = (String[])keysList.toArray(new String[keysListSize]); //这个List变成指定大小的数组 Set<String> sinterIds = jedis.sinter(convertKeysArr);//sinter(...)求多个集合的交集,可以接收动态参数...动态参数本质上是数组.
sinter中传入的可以是一个动态的参数.....动态的参数本质上是数组.
关于动态数组的总结博客:
其次是JDBC动态接受参数个数的方式:
原本查询语句是select * from asset where assetname like ? and director like ? and programtype like ? and actor like ? screenwriter like ? and region like ? ........ 但是查询条件不固定....不一定有对应的对应的查询项 Map<String,Integer> countMap = new HashMap<String,Integer>();//因为预处理参数需要记录值和对应值在sql语句中的位置 //这里使用Map的方式,值是key,sql中的第几个数字作为value //定义sql语句 ?表示占位符 StringBuilder sql = new StringBuilder(); sql.append("select * from asset where "); if(assetname != null && assetname != ""){ sql.append(" assetname like ?"); countMap.put(assetname,countMap.size()+1); } if(director != null && director != ""){ if(countMap.size() < 1){ sql.append(" director like ?"); }else{ sql.append(" and director like ?"); } countMap.put(director,countMap.size()+1); } if(programtype != null && programtype != ""){ if(countMap.size() < 1){ sql.append(" programtype like ?"); }else{ sql.append(" and programtype like ?"); } countMap.put(programtype,countMap.size()+1); } ....................................... //设置参数preparedStatement,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值 if(assetname != null && assetname != ""){ preparedStatement.setString(countMap.get(assetname), "%"+assetname+"%"); } if(director != null && director != ""){ preparedStatement.setString(countMap.get(director), "%"+director+"%"); //preparedStatement.setString(countMap.get(director),director); }
相关文章推荐
- JDBC获取SQL查询语句返回记录数的三种方式效率比较
- Hibernate查询的各种方式效率比较
- Hibernate查询的各种方式效率比较
- Hibernate查询的各种方式效率比较
- Hibernate查询的各种方式效率比较
- JDBC获取SQL查询语句返回记录数的三种方式效率比较
- Solr4.0(SolrCloud) & ElasticSearch(ES) 比较(三):查询方式(query_then_fetch)
- in及not&nbsp;in与组合查询的效率比较
- Hibernate自动创表&&Hibernate的四种查询方式
- Hibernate 查询方式比较与用法
- 抛砖引玉:MySQL数据库中,在Spring+Hibernate条件下,比较like和=查询日期的效率
- Hibernate查询方式l比较
- hibernate六种查询方式比较
- Hibernate查询方式比较
- Hibernate&jdbc 谁的效率高?
- (ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较
- hibernate模糊查询的几种方式
- hibernate 三种查询方式
- Hibernate的查询方式
- sql语句的优化分析之一查询语句中左连接和函数效率分析比较