java 如何 从数据库批量取数入队列,再逐条处理。关键是消息队列的实现。谢谢

java 如何 从数据库批量取数入队列,再逐条处理。关键是消息队列的实现。谢谢,第1张

为什么要用到消息队列

你这个需求貌似只需要队列这个数据结构就行了

使用JDK中自带的就行,LinkedList是实现Queue的

Queue queue = new LinkedList();

queueadd(Object )//尾部添加

queueremove()//头部取出

你只需要将通过JDBC把数据库取出的对象用循环依次add到queue, 然后再通过循环依次remove就行了

双端队列数据类型

typedef struct qnode

{

DataType

data;

struct

qnode

next;

}LQNode;

typedef struct

{

LQNode

front;

LQNode

rear;

}LQueue;

尾出队:首先判断队列是否为空,如为空则提示队列为空,如不为空则将队尾结点

赋给临时结点。将队尾结点的前驱指针赋给队列的队尾指针,再将队尾结

点的后继指针置空。最后返回临时结点或所需要的数据。

不能简单说谁好谁坏,各有适用场景。

数据库在持久化方面比较好,服务宕机,数据还在,但并发性能方面不如缓存。

如果用缓存,最主要是要处理好多线程时线程安全、宕机缓存丢失的问题。如果是分布式部署,同步缓存也要考虑。

//

/ 链式队列 /

//

#include "stdlibh"

#include "stdioh"

/ 定义链式队列类型 /

typedef int ElemType;

typedef struct QNode

{ ElemType data;

struct QNode next;

} QNode, QueuePtr;

typedef struct

{ QueuePtr front;

QueuePtr rear;

} LinkQueue;

/ 1、初始化链式队列 /

void InitQueue(LinkQueue Q)

{ Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));

if (!(Q->front)) exit(0);

Q->front->next=NULL; }

/ 2、销毁链式队列 /

void DestroyQueue(LinkQueue Q)

{ while (Q->front)

{ Q->rear=Q->front->next;

free(Q->front);

Q->front=Q->rear; }

}

/ 3、清空链式队列 /

void ClearQueue(LinkQueue Q)

{ QueuePtr p;

p=Q->front->next;

while (p)

{ Q->front->next=p->next;

free(p); }

Q->rear=Q->front;

}

/ 4、判断空队列 /

int QueueEmpty(LinkQueue Q)

{ if (Qfront==Qrear)

return 1;

else

return 0; }

/ 5、求链式队列长度 /

int QueueLength(LinkQueue Q)

{ QueuePtr p; int n=0;

p=Qfront;

while (p!=Qrear)

{ n++; p=p->next; }

return n;

}

/ 6、取队头元素 /

ElemType GetHead(LinkQueue Q)

{ if (Qfront!=Qrear)

return Qfront->next->data;

}

/ 7、入队列 /

void EnQueue(LinkQueue Q, ElemType e)

{ QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

if (!p) exit(0);

p->data=e; p->next=NULL;

Q->rear->next=p;

Q->rear=p; }

/ 8、出队列 /

void DeQueue(LinkQueue Q, ElemType e)

{ QueuePtr p;

if (Q->front!=Q->rear)

{ p=Q->front->next;

e=p->data;

Q->front->next=p->next;

if (Q->rear==p) Q->rear=Q->front;

free(p); }

}

/ 9、遍历链式队列并输出元素 /

void QueueTraverse(LinkQueue Q)

{ QueuePtr p;

printf("\nQueue: ");

p=Qfront->next;

while (p)

{ printf("%d\t",p->data);

p=p->next;}

}

/ 约瑟夫问题 /

void Joseffer(int n)

{ LinkQueue Q; int i; ElemType x;

InitQueue(&Q);

for(i=1; i<=n; i++)

EnQueue(&Q,i);

while (!QueueEmpty(Q))

{ for(i=1; i<=3; i++)

{ DeQueue(&Q,&x);

if (i!=3)

EnQueue(&Q,x);

else

printf("%5d",x);

}

}

}

/ 主函数 /

main()

{ LinkQueue Q; int i; ElemType x;

InitQueue(&Q);

for(i=2; i<=5; i++)

EnQueue(&Q,i);

printf("len:%d\n",QueueLength(Q));

while (!QueueEmpty(Q))

{ DeQueue(&Q,&x);

printf("%d\t",x); }

//QueueTraverse(Q);

//Joseffer(6);

}

自己去调试吧,这个是C语言版的链式队列,如果看不懂或者调不出来就去看书吧。否则你这门是白学了。

注:这里是链式队列

//

/ 循环队列 /

//

#include "stdlibh"

#include "stdioh"

#define N 100

/ 定义循环队列类型 /

typedef int ElemType;

typedef struct

{ ElemType base;

int front;

int rear;

} SqQueue;

/ 1、初始化循环队列 /

void InitQueue(SqQueue Q)

{ Q->base=(ElemType)malloc(Nsizeof(ElemType));

Q->front=Q->rear=0; }

/ 2、销毁循环队列 /

void DestroyQueue(SqQueue Q)

{ free(Q->base); }

/ 3、清空循环队列 /

void ClearQueue(SqQueue Q)

{ Q->front=Q->rear=0; }

/ 4、判断空队列 /

int QueueEmpty(SqQueue Q)

{ if (Qfront==Qrear)

return 1;

else

return 0; }

/ 5、求循环队列长度 /

int QueueLength(SqQueue Q)

{ return (Qrear+N-Qfront)%N; }

/ 6、取队头元素 /

void GetHead(SqQueue Q, ElemType e)

{ if (Qfront!=Qrear)

e=Qbase[Qfront];

}

/ 7、入队列 /

int EnQueue(SqQueue Q, ElemType e)

{ if ((Q->rear+1)%N==Q->front)

return 0;

Q->base[Q->rear]=e;

Q->rear=(Q->rear+1)%N;

return 1; }

/ 8、出队列 /

int DeQueue(SqQueue Q, ElemType e)

{ if (Q->front==Q->rear)

return 0;

e=Q->base[Q->front];

Q->front=(Q->front+1)%N;

return 1; }

/ 9、遍历循环队列并输出元素 /

void QueueTraverse(SqQueue Q)

{ int i;

printf("\nQueue: ");

if (Qrear<Qfront) Qrear=Qrear+N;

for(i=Qfront; i<Qrear; i++)

printf("%d\t",Qbase[i%N]); }

/ 主函数 /

main()

{ SqQueue Q; int i; ElemType x;

InitQueue(&Q);

for(i=2; i<=5; i++)

EnQueue(&Q,i);

printf("len:%d\n",QueueLength(Q));

while (!QueueEmpty(Q))

{ DeQueue(&Q,&x);

printf("%d\t",x); }

QueueTraverse(Q);

}

在给你个循环队列吧

sql数据库出现队列问题可以这样解决:文中从 select limit 1 这一点开始,也就是 limit 1这东西出现开始,思路就错了。错就错在worker不应该管理任务的分发(当worker会去回写mysql,就参与了任务的分发),只负责单调领任务即可。分发的事情交给独立的进程配合mq或者redis进行。

以上就是关于java 如何 从数据库批量取数入队列,再逐条处理。关键是消息队列的实现。谢谢全部的内容,包括:java 如何 从数据库批量取数入队列,再逐条处理。关键是消息队列的实现。谢谢、C语言中怎么实现双端队列这个数据结构、java任务队列用缓存还是数据库表实现较好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9368690.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存