是这样的,我有一个jsp界面,
setInterval(function (){
$.post(url,data,function()
{
do something
});
},2000);
这段代码主要是每隔两秒就像Struts2的action发出一次请求,从而获取数据库中的数据。
第一次获取数据库第一条记录的数据,第二次第二条,以此类推。假设我现在数据库有N条数据,我希望定时器获取了N次信息之后把定时器清除,要怎么做?数据库操作采用的是hibernate。(ps:不想每次都select count(*) 这样可以做到么)下面来个郁闷的测试代码。main函数如下:
String properties[]={"sensorInputDataID","value","valueType"};
List<Object[]> list=baceDao.getSpecifiedRanges(SensorInputData.class, properties,"201","1");
for(Object[] obj:list)
{
System.out.println("id="+obj[0].toString()+", value="+obj[1].toString()+",valueType="+obj[2].toString());
}
if(list==null)
{
System.out.println("null");
}
其中bacedao的getSpecifiedRanges代码如下
public List<Object[]> getSpecifiedRanges(Class<? extends Object> table,String[] properties,String startIndex,String rowCount)
{
int propertysLength= properties.length;
String hql="select ";
for(int i=0;i<propertysLength-1;i++)
{
hql+=properties[i]+",";
}
hql+=properties[propertysLength-1]+" from "+table.getSimpleName();
System.out.println(hql);
List<Object[]> result=sessionFactory.getCurrentSession().createQuery(hql).setFirstResult(Integer.parseInt(startIndex)).setMaxResults(Integer.parseInt(rowCount)).list();
return result;
}
执行之后,后台信息如下(我数据库只有200条记录):
好像都没有比较好的方案。我本来是想在数据库取到N+1条的时候,报错,然后抓取这个错误来解决的。可惜后台根本不报错。
我现在的方案是,开始的时候查一次数据库的count(*),并将其赋给变量rowCount。当前记录为index,第一次取数据,index为1,第二次为2以此类推。当index==rowCount的时候,再查一次count(*),若此时rowCount>index,则定时器继续执行,迭代上述步骤。否则清除定时器。
两种方式
1、setInterval前select count(*) 一次获取总数,然后记录数量,在循环N次取数
2、每次取一条,如果没有记录了后台返回null,前端就知道没数据了,只是得多取一次才知道。
另种方式查询数据库的次数都一样,都是N+1次
将从数据库相应表中查找所有数据并件查到的数据放在一个dtatable中用if判断判断你要比较的数据与datatable中最后一条数据是否相同就可以了
首先想问一下,数据库的数据条数是变化的吗?如果不是,那么定义一个变量 j=0,从取第一条数据开始自加,j=n时为最后一条数据,判断j 就可以了。
还有一种办法就是维护一个List<集合>,定义一个变量与集合的记录数进行对比,相等时为最后一条。方法不是很聪明,但是应该可以用。祝你成功。
那可以用我说的第二种方法,维护一个List集合,集合的数据时表里的数据,数据库变化时更新集合,然后对集合进行枚举操作。直接对数据库操作是I/O操作,费时费力,维护一个集合就避免了直接和数据库打交道!希望对你有用
先count(*),然后按照某个主键排序。顺序取就可以了。
查询数据库的次数都一样,都是N+1次