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 block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static boolean matches(String value) {
......
......
......
return flag;
}
}
[quote]不好意思,我题目有点问题,match其实两个参数,一个是前台传过来的参数,是会变的,另外一个是数据库中某一列的值。[/quote]
这样的话,如果不使用存储过程,也没什么优化的余地了。
如果tb的记录数不是太多,先读取所有的记录,完成查询先。再多线程去筛选结果。
如果较多,在查询的时候就需要了。
每个线程分页查询。如先得到min(id),max(id)。。。。
用ORMapping框架不可吗,这些需求ibatis、hibernate都已解决,且成熟了。建议而已。。
嗯,很抱歉没认真读题。
就ibatis而言,它是支持编写TypeHandlerCallback的,才结果集回调里面做Matcher。而且像并发多线程、缓存等,框架都有实现。LZ可以试用下,看看效率问题有否解决。
不喜莫怪:)
我的想法
1.执行sql的优化
2.matches方法的优化
3.matches耗时间,看看matches方法里的过滤条件能否移到sql里,这样可以过滤记录,减少循环次数
4.如果还不行,你再考虑其他的办法。
楼主的意思是想根据value的结果进行筛选,你使用matches方法进行逐个筛选,效率肯定不会高。
不知道这个matches逻辑 有多复杂,
最合适的方案是将它写成一个存储过程(函数),放到数据库端,由数据库自身进行过滤。
select id, value from tb where your_proc(value) = 1
[quote]目前其实这个matches是一个人家分装好的算法,我们只能通过调用它们的api来进行比较。[/quote]
如果你不想改进的话,一条条筛选,效率是不会高的。那样只会依赖于:
1. 那个表本身的大小
2. matches API实现本身的效率
如果实在不行,你可以增加一列,为该表,把matches(value)值存储到该列。
这样,直接查询就行,速度要快很多。