问题描述
public class Test {public static void main(String[] args) {ResultSet results = null;List<Integer> ids = new ArrayList<Integer>();String querySQL = "select id, value from tb";try {Class.forName("com.mysql.jdbc.Driver").newInstance();Connection con = java.sql.DriverManager.getConnection("jdbc:mysql://localhost/demo?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull","root", "root");results = con.createStatement().executeQuery(querySQL);String value;while (results.next()) {value = results.getString("value");if (matches(value)) {ids.add(results.getInt("id"));}}con.close();} catch (SQLException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static boolean matches(String value) {...... ............return flag;}} 问题补充:shansun123 写道
解决方案
引用不好意思,我题目有点问题,match其实两个参数,一个是前台传过来的参数,是会变的,另外一个是数据库中某一列的值。这样的话,如果不使用存储过程,也没什么优化的余地了。
解决方案二:
引用目前其实这个matches是一个人家分装好的算法,我们只能通过调用它们的api来进行比较。如果你不想改进的话,一条条筛选,效率是不会高的。那样只会依赖于:1. 那个表本身的大小2. matches API实现本身的效率如果实在不行,你可以增加一列,为该表,把matches(value)值存储到该列。这样,直接查询就行,速度要快很多。
解决方案三:
楼主的意思是想根据value的结果进行筛选,你使用matches方法进行逐个筛选,效率肯定不会高。不知道这个matches逻辑 有多复杂,最合适的方案是将它写成一个存储过程(函数),放到数据库端,由数据库自身进行过滤。select id, value from tb where your_proc(value) = 1
解决方案四:
我的想法1.执行sql的优化2.matches方法的优化3.matches耗时间,看看matches方法里的过滤条件能否移到sql里,这样可以过滤记录,减少循环次数4.如果还不行,你再考虑其他的办法。
解决方案五:
嗯,很抱歉没认真读题。就ibatis而言,它是支持编写TypeHandlerCallback的,才结果集回调里面做Matcher。而且像并发多线程、缓存等,框架都有实现。LZ可以试用下,看看效率问题有否解决。不喜莫怪:)
解决方案六:
matches方法本身的耗时,线程是解决不了的.匹配的算法...-
解决方案七:
用ORMapping框架不可吗,这些需求ibatis、hibernate都已解决,且成熟了。建议而已。。
解决方案八:
多线程筛选结果吧。---如果tb的记录数不是太多,先读取所有的记录,完成查询先。再多线程去筛选结果。如果较多,在查询的时候就需要了。每个线程分页查询。如先得到min(id),max(id)。。。。