每个十秒读一次数据库

liujunshi603 2010-09-27 11:33:54
有一张表T_a 两个字段Id,XXX。
数据会不断的增加,Id自增。
需求每隔十秒过来读一次,然后记下读到哪个Id了,记下来。如果数据增加了,然后下一次来就接着读。那么这个Id要存在哪里合适呢?肯定是要一个静态的成员变量。
另外没十秒读一次,怎么实现合适呢?起一个线程然后sleep?那connection用不用释放呢?
帮忙分析下好不?
...全文
313 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tfwn2419 2010-09-28
  • 打赏
  • 举报
回复
从上面的分析中,也应该可以分析出一个原因:为什么所有的语句,只需要捕捉 Exception 就可以捕捉所有的异常:
try{
//......
}catch(Exception ex){
}

因为 Exception 是所有异常类的基类,在 try 语句块中无论抛出哪一个异常,都将被当作 Exception 对象而被捕捉。


这也可以解释 java 的另一个异常捕捉原则:当有多个异常需要捕捉时,不能把 Exception 放在第一个要捕捉的异常,也就是说也不能把父类的异常放在子类异常的捕捉声明之前,下面的代码是编译不过的:

try{
// ......
}catch(Exception ex){
}catch(Exception1 ex1){
}catch(Exception2 ex2){
}catch(Exception3 ex3){
}

因为 Exception2 是 Exception1 的子类,当try语句块内抛出 Exception2 时,它会被当作 Exception1 而被捕捉,这样一来,捕捉 Exception2 的语句就永远不会被执行到,javac.exe 可以检测到不可能被执行的代码而报错
liujunshi603 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mybeautiful 的回复:]

那么这个Id要存在哪里合适呢?肯定是要一个静态的成员变量。

也可以,但是不够安全,要是程序死掉了,你不是要从头开始读? 可以考虑保存在文件或数据库中
[/Quote]

程序死掉重启之后可以读一次数据库的最后一条然后再赋值给这个变量。
不过这样的确不太安全。可能会有数据的丢失啊。嗯写在某个文件上不错。
Mybeautiful 2010-09-27
  • 打赏
  • 举报
回复

import java.io.IOException;
import java.util.Timer;

public class TimerTest {

public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了
try {
int ch = System.in.read();
if(ch-'c'==0){
timer.cancel();//使用这个方法退出任务

}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


static class MyTask extends java.util.TimerTask{

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("________"); //你的逻辑写这里。
}
}
}


参考下
liujunshi603 2010-09-27
  • 打赏
  • 举报
回复
就比如我怎么能能每十秒去执行一个方法呢?
wangguilin 2010-09-27
  • 打赏
  • 举报
回复
个人觉得connection 可以不用释放,不过可以做个判断,connection有没有被异常关闭掉了
Mybeautiful 2010-09-27
  • 打赏
  • 举报
回复
那么这个Id要存在哪里合适呢?肯定是要一个静态的成员变量。

也可以,但是不够安全,要是程序死掉了,你不是要从头开始读? 可以考虑保存在文件或数据库中
liujunshi603 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mybeautiful 的回复:]

起一个线程然后sleep , 可以,但是不好。
可以使用 java.util.Timer,
如果复杂的话,可以引入 Quartz.
[/Quote]
Timer?听起来不错,可以稍微具体的说一下嘛。谢谢啦、
Mybeautiful 2010-09-27
  • 打赏
  • 举报
回复
起一个线程然后sleep , 可以,但是不好。
可以使用 java.util.Timer,
如果复杂的话,可以引入 Quartz.
softwarexiang120 2010-09-27
  • 打赏
  • 举报
回复
很好,很强大!
gaojava 2010-09-27
  • 打赏
  • 举报
回复
quartz
铁匠梁老师 2010-09-27
  • 打赏
  • 举报
回复
频繁操作数据库不释放数据库连接,建建立连接比较耗时
hattie019425 2010-09-27
  • 打赏
  • 举报
回复
不知道你用的是什么数据库,如果你用的是Oracle是可以回调Java的。
呵呵 挺神奇吧。
看看这个链接
http://blog.csdn.net/qiuzhuoxian/archive/2010/06/19/5679602.aspx
这种实现是不是好多了
windforcecn 2010-09-27
  • 打赏
  • 举报
回复
如此频繁的数据库操作

建议写成存储过程

不知道你是什么数据库

oracle的sequence是自增长的,得到当前的值可用currentVal
barsk 2010-09-27
  • 打赏
  • 举报
回复
quartz还不错,用这个吧。
_Laity 2010-09-27
  • 打赏
  • 举报
回复
学习下。
zxb346571110 2010-09-27
  • 打赏
  • 举报
回复
如果你只是想每十秒钟执行一个方法的话建议你用Thread.sleep()这个方法
crazylaa 2010-09-27
  • 打赏
  • 举报
回复
加个表记录上次的最大id。这样查询语句可以直接在一个sql写,用不着去打开文件,也用不着去写文件等等。每次处理完把最大id更新一下就好。而且,一条记录的表,基本几毫秒就更新完毕。查询,因为是一条记录的表与原始表联查,也很快。
wula0010 2010-09-27
  • 打赏
  • 举报
回复
看你是什么应用,如果是桌面应用,timer是最好的选择,如果是web的,用ajax
DryKillLogic 2010-09-27
  • 打赏
  • 举报
回复
我觉得不用释放Connection,只作一下Connection是否有效地判断就行了吧,直接死循环,然后每循环一次sleep10秒钟
maquan 2010-09-27
  • 打赏
  • 举报
回复
楼主准备做 web application 还是 standalone application ?
不同的情况,定时机制是不同的。
加载更多回复(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧