请问一个数据库问题

时间:2022-12-11 18:03:48
请问,用oracle数据库,以及java
要设计一个系统,要扫描一张表,表无主见,取出表中的记录并向短信网关发送短信。
当发送成功时放到另外一张表中,并删除对应记录,没成功则不变
扫描表的时候,应该才用那种方式扫描比较好呢。
1。每次扫描一条,发送一条,这样肯定不好。
2。全部扫描,取出所有记录,但是对内存要求是不是又过大的, 如果记录太多的话。
3。每次扫描固定数值的记录,如1000条,这个看来是比较好的,
   但是我有一个比较糊涂的地方,
   a.怎么能社定每次取的条数,好象sql中没有这样的办法。
   b.怎么能保证这次取的没有和上一次取出的重复呢,

谢谢各位!

5 个解决方案

#1


倒,!!
你可以自己在程序里面设定一个计数变量啊。
如:
int CurrentCount = 0;
int MaxSize = 20;
..
...

while (set.next() )
{
   if ( CurrentCount >= MaxSize )
      break;  //跳出循环,不再取数据
   ....
   CurrentCount++;
}

#2


至于不取出上次的值则取决于你的数据库如何设计了。
通常这种发机表(我习惯这么说)都会设计一个字段来标识那些记录的状态
如:
0-代表等待发送
1-代表正在发送中
2-代表发送成功
...

然后你每次读取了一条数据就更新那条数据的那个字段为1,这样在下次再读取的话就不会重复读取出来了。

#3


再送你一点,如果你的处理机制是先读取,再发送,等全部发送完成后更新数据库,然后再读取的话,可以不采用我上面提到的字段标识。
控制读取多少条的话也不用采取变量控制的方法。因为在oracle中有一个控制读取多少条的方法(但仅适用于oracle、其他数据库是不相同的)
select * from table where rownum <100
这句sql就表示只读表中的前100条数据。

#4


你觉得这样怎么样的,我想了想的, cloudysunny(蓝天下的雨云)大虾!

我做的系统是和移动,连通短信网关通信的程序。
其中涉及到从oracle数据库中的一张表a取出记录,发送,
如果发送成功,把这条记录从a表中删除,记录到表b中去。
如果失败,则还保留在表a 中等待下次再发送。

我的想法是开两个线程同时扫描这个表,根据mediaid的不同,每个线程取属于自己的记录。
取数据记录的时候,我的想法是最好一次不能取出太多,假如取1000条的话,
第一次取的时候把参数2和3设置为1,1000,
发送的时候,我记录成功的次数,比如为temp
那我下一次取的时候,把参数2,3设置为,1000-temp, 2000-temp 就应该可以取出下1000条了吧。这样循环取下去,我想9可以把这个表便利一次了的。
select results.* from   
( select t2.*, rownum rownumber from   
( select a.* from a where mediaid = ?1 order by status) t2) results   
where results.rownumber between ?2 and ?3   

这样做效率如何的,能不能实现的。因为这个系统的数据量是突法性的,很可能平时数据很少,某个时间数据量特别大的。
ps:我怎么得到一个表的记录数目有多少呢,谢谢!

#5


怎么得到一个表的记录数目有多少呢
可以用count()函数
select count(id) total from table;
执行这样的 SQL语句total的值就是记录数 。

#1


倒,!!
你可以自己在程序里面设定一个计数变量啊。
如:
int CurrentCount = 0;
int MaxSize = 20;
..
...

while (set.next() )
{
   if ( CurrentCount >= MaxSize )
      break;  //跳出循环,不再取数据
   ....
   CurrentCount++;
}

#2


至于不取出上次的值则取决于你的数据库如何设计了。
通常这种发机表(我习惯这么说)都会设计一个字段来标识那些记录的状态
如:
0-代表等待发送
1-代表正在发送中
2-代表发送成功
...

然后你每次读取了一条数据就更新那条数据的那个字段为1,这样在下次再读取的话就不会重复读取出来了。

#3


再送你一点,如果你的处理机制是先读取,再发送,等全部发送完成后更新数据库,然后再读取的话,可以不采用我上面提到的字段标识。
控制读取多少条的话也不用采取变量控制的方法。因为在oracle中有一个控制读取多少条的方法(但仅适用于oracle、其他数据库是不相同的)
select * from table where rownum <100
这句sql就表示只读表中的前100条数据。

#4


你觉得这样怎么样的,我想了想的, cloudysunny(蓝天下的雨云)大虾!

我做的系统是和移动,连通短信网关通信的程序。
其中涉及到从oracle数据库中的一张表a取出记录,发送,
如果发送成功,把这条记录从a表中删除,记录到表b中去。
如果失败,则还保留在表a 中等待下次再发送。

我的想法是开两个线程同时扫描这个表,根据mediaid的不同,每个线程取属于自己的记录。
取数据记录的时候,我的想法是最好一次不能取出太多,假如取1000条的话,
第一次取的时候把参数2和3设置为1,1000,
发送的时候,我记录成功的次数,比如为temp
那我下一次取的时候,把参数2,3设置为,1000-temp, 2000-temp 就应该可以取出下1000条了吧。这样循环取下去,我想9可以把这个表便利一次了的。
select results.* from   
( select t2.*, rownum rownumber from   
( select a.* from a where mediaid = ?1 order by status) t2) results   
where results.rownumber between ?2 and ?3   

这样做效率如何的,能不能实现的。因为这个系统的数据量是突法性的,很可能平时数据很少,某个时间数据量特别大的。
ps:我怎么得到一个表的记录数目有多少呢,谢谢!

#5


怎么得到一个表的记录数目有多少呢
可以用count()函数
select count(id) total from table;
执行这样的 SQL语句total的值就是记录数 。