系统短信发送为什么要使用线程?

前几天开发审批单据通过后发送短信功能,我做二次开发,根据系统原有代码进行增加功能操作,我观察之前的代码是创建了线程,但是不清楚为什么创建线程,且线程内使用了jdbc连接数据库的方式,上网上查这种方式好像是数据库连接池,所以我想问,为什么发送短信要使用线程,且线程中为什么创建数据库连接池?还请帮忙解答。

2个回答

1.短信这种功能最好是异步的,因为你发的快一点慢一点,用户是无感知的。不新开线程出来,就需要一直等待短信发完才能执行后续代码。
2.数据库连接池就是方便管理数据库的。如果每开一个线程就创建一个数据库连接的话,很容易把数据库连接占满出现too many connections问题的。

因为发送短信需要等待服务器返回,整个过程环节多,延迟比较大(秒级别),如果不用线程,那么等于整个服务器所有的资源全部歇着,等短信调用,效率非常低。如果要发100个,每个2秒,就得200秒。
好的做法是异步放在线程执行,主程序继续做别的,这样可以提高吞吐率,如果开多个线程,相同的时间可以发成千上万的短信。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
线程的优、缺点?为什么要使用线程
线程的优、缺点?
多线程理解和我们为什么要使用线程
首先说下多线程出现的原因: 为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作时或处理的情况需要花费大量的时间等等,比如:读写文件,视频图像的采集,处理,显示,保存等 多线程的好处: 1.使用线程可以把占据时间长的程序中的任务放到后台去处理 2.用户界面更加吸引人,这样比如用户点击了一个按
线程池中为什么要使用阻塞队列?
在线程池中活跃线程数达到corePoolSize时,线程池将会将后续的task提交到BlockingQueue中,主要是考虑到: 在一个task提交到线程池时,假设可以被线程池中的一个线程执行,则进行以下过程: exeute ---》addWorker(Runnable command, boolean core)---》workers.add(w),启动线程执行任务(获取全局锁Reentra
为什么socket编程要用到线程
在socket编程中通常都要用到线程,rn为什么?
为什么系统级钩子要使用DLL.
为什么系统级钩子要使用DLL?rn谢谢!
socet短信发送与线程设计的问题
需求是这样的,我从来没有做过socket与线程的东西:现在有这样的需求:rnrn 一个小灵通短信发送平台,我们的现在是使用客户端的socket然后向小灵通平台服务发送一个串,串的格式是这样的:rnout.println("\r\n");rn这其中变量 called_num是电话号码,而info是短信内容rnrn要求有短信群发,并且要求反馈回正确的短信发送结果。rn平台上是这样提供的:rnrn 当你发送成功后,会返回ST_OK的串值,失误则会发送ST_ER,rn 现在有一个重要通知要发送,发送前选中要发送的人,包括群发。然后提交后会有一个反馈结果:比如是给****发送成功,给****发送失误。并且要求支持有重发功能,但是如果使用重发功能的话,这个返回结果就会很慢才出来,因为要等它发送规定的次数后才会显示结果,这个问题需要如何解决?rnrnrn 另外一点,我们需要进行线程设计,把小灵通短信发送这一部分单独拿出来。比如说通知内容是一部分,小灵通发送可以放到线程当中这样设计是否合理?而反馈结果要写入数据库表当中,这样的话我应当在线程中的哪个部分处理?rnrn 还有一点就是,在socket当中进行读取返回值时,会不会很慢?rnrn 线程这一部分我该如何设计?希望各位做过socket的朋友给些意见,这个问题困挠我好久了,急死人了!rnrn下面附上短信发送的函数:rn public void SMSsend(String phone, String sms) rn //BufferedReader in;rn BufferedInputStream in;rn PrintWriter out;rn rn String called_num = phone;rn String info = sms;rn try rn socket = new Socket(hostIP, Integer.parseInt(hostPort));rn //in = new BufferedReader( new InputStreamReader(socket.getInputStream()));rn in = new BufferedInputStream(socket.getInputStream()); rn out = new PrintWriter(socket.getOutputStream(), true);rn out.println("\r\n");rn rn byte[] tmp=new byte[5]; rn in.read(tmp); rn String str=new String(tmp); rn catch (Exception e) rn System.out.println(e.getMessage()); rn rn rn
VC++书友会短信发送系统
功能 书友会短信发送系统由基础信息模块、短信管理模块、短信投票模块、系统管理模块等几部分组成。  基础信息模块 该模块主要包括短信猫设置、会员信息设置、常用语设置3部分。  短信管理模块 该模块主要包括发送短信、短信查询、接收短信3部分。  短信投票模块 该模块主要由投票项目、投票统计两部分组成。  系统管理模块 该模块主要由用户管理、数据清理、退出系统3部分组成。
vb-短信发送系统
vb 短信发送系统 对于开发短信的朋友有一些帮助
*黄金屋*书友会短信发送系统
基于VB6.0 SQL2000 短信猫 整个开发过程和源代码
短信发送平台系统
改软件给企业内提供一个交流的平台
黄金书友会短信发送系统
书友会短信发送系统:通过本系统可以对指定的一组电话号码进行短信群发,也可以对回复的项目投票进行统计分析。系统自身还有对已发短信的查询功能以及查看SIM卡中收到的短信。
msg短信发送系统
msg短信发送系统
阿里云短信发送系统PHP
文件清单 api_demo(短信服务API接口调用DEMO工程) api_sdk(短信服务API接口依赖的SDK) msg_demo(短信回执消息的DEMO) msg_sdk(短信回执消息的SDK)
书友会短信发送系统源代码
书友会短信发送系统 书友会短信发送系统 书友会短信发送系统 书友会短信发送系统 书友会短信发送系统书友会短信发送系统 书友会短信发送系统
关于短信发送系统的回复
我们公司最近购买了一个短信发送模块,可以通过串口发送短信。由于模块使用普通的SIM卡,所以发出的短信其发送人是一样的。我想问的是:rn现在很多网站发送的短信是可以直接回复的,不同的注册用户,其发送的短信源号码也是不一样的,这样就可以直接回复。网站收到回复的短信后,经过处理,可以将内容发送到用户的计算机客户端,比如QQ和网易泡泡就是这样子的。那么要实现不同的发送号码,是不是需要到移动公司去申请专门的号码群或者使用什么大型的设备才能够实现?rn请做过网站开发的朋友指教,谢谢。
塞班系统短信发送拦截
各位大侠,请问如何在塞班系统上实现短信发送前的拦截啊?能不能提供代码让小弟学习学习 rn由于小弟刚刚开始学习编程,对很多东西不熟悉,请大侠们尽量说的详细些以便小弟能够理解。谢谢!
基于短信猫的短信发送系统
基于短信猫的短信发送系统, .net 版本,短信猫发送数据基于短信猫的短信发送系统, .net 版本,短信猫发送数据基于短信猫的短信发送系统, .net 版本,短信猫发送数据
书友会短信发送系统
利用短信猫实现短信的发送和接收;利用函数实现INI文件的操作;利用图片设计系统的登陆窗口;利用MSChart控件显示投票统计结果
JSP+SQL2000邮件 短信发送系统
JSP+SQL2000邮件 短信发送系统,调试成功的系统
通用短信发送系统webservice接口
msg 返回值 描述 0 失败 1 发送成功 101 系统错误 102 无该企业或者密码错误,或者企业,密码为空 103 企业被禁用 104 业务错误 105 余额不足 106 IP限制 107 系统繁忙 108 非法词组 109 手机黑名单 999 发送失败 111 手机格式错误 112 手机号码为空 113 发送内容为空 114 发送内容太长 115 Msg_id太长。 116 手机号码超过最大值。
系统短信发送 Demo
调用 iOS 系统短信,发送短信的功能。
C++ 为什么要使用继承?为什么要使用动态绑定?为什么要使用虚函数?
继承和动态绑定对程序的编写有两方面的影响:   使用继承,我们可以更容易地定义与其他类相似但不完全相同的新类;   使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。 ———————————————————————————————————————————   通过使用动态绑定,我们能用同一段代码分别处理基类和派生类们的对象。在C++语言中,当我们使用基类的引用(或指针...
为什么要使用MVP
MVC模式 在往常一样,我们都是用MVC来入门一个app,M-model,V-view,C-controller。 在android中的controller也就是activity、fragment等,别忘了他们也是干初始化view的工作以及操作view状态实际更新的地方,所以在同一个地方,我们就混杂了controller。所以代码就不好看了,好难维护。 MVP模式 MVP模式就是将MVC的工作分
为什么要使用Spring
提高解耦,增强可扩展性 分析:         当我们使用某个功能组件的时候,我们直接创建这个功能组件会出现什么问题?   当这个功能组件很简单的时候,我们直接创建并使用它确实很简单明了,但是软件开发本来就是一个不断扩展的过程,本来很简单的功能组件随着时间的推移,它将会越来越复杂,这个时候当我们需要使用这个组件的时候,还适合直接去创建并使用它吗?答案当然是否定的。原因如下:    当
为什么要使用消息队列
1 消息队列解决的是将突发大量请求转换为后端能承受的队列请求,比如你的服务器一秒能处理100个订单,但秒杀活动1秒进来1000个订单,持续10秒,在后端能力无法增加的情况下,你可以用消息队列将总共10000个请求压在队列里,后台consumer按原有能力处理,100秒后处理完所有请求(而不是直接宕机丢失订单数据) 2 待补充。。。
为什么要使用HandlerThread
在android-sdk/sources/android-x下可以看到源码。 在android.os的包下,有一个HandlerThread的类,继承自Thread,是Google提供的线程类。 package android.os; public class HandlerThread extends Thread {} 为什么要提供这类呢,下面对此进行分析:
为什么要使用memcache
1.为什么要使用memcache 由于网站的高并发读写需求,传统的关系型数据库开始出现瓶颈,例如: 1)对数据库的高并发读写: 关系型数据库本身就是个庞然大物,处理过程非常耗时(如解析SQL语句,事务处理等)。如果对关系型数据库进行高并发读写(每秒上万次的访问),那么它是无法承受的。 2)对海量数据的处理: 对于大型的SNS网站,每天有上千万次的数据产生(如twitter, 新浪微博)。
为什么要使用SCRUM?
为什么要使用SCRUM呢?对个人而言 通过不断的迭代降低了项目的风险。 对于项目的工作任务透明可见。 不断的检查,适时调整改进。 灵活调整工作任务,“祸兮,福之所倚。。。” 对团队而言 项目持续进行,按既定的计划推进。 优先保证项目计划内的工作任务,减少临时工作安排。 个人对任务的把握掌控较高。 有利于整个团队对项目的推进。 5. 专业的人干专业的事。
为什么要使用u-boot
u-boot的目的:启动内核; 内核的目的:运行应用程序。 u-boot的主要工作: (从Flash中读取内核,写入到SDRAM中,启动内核。所以最主要的就是读Falsh,写SDRAM,但在这步骤当中就需要很多配合的工作。方便观察信息可能需要串口;为了读Flash,你可能要外扩nand flash;为了将最初的u-boot/kernel写入Flash,就需要下载的方式,可能是SD卡/以太网;
为什么要使用矩阵
我们不妨回忆一下,矩阵是怎么产生的。矩阵可以看成是一个个向量的有序组合,这说明矩阵可以类比向量;但是向量又是怎么产生的?向量则是一个个数字的有序组合,这又把我们的研究方向指向了“数字是什么”这个问题上。比如,数字1是什么?它可以代表1米,可以代表1千克,也可以代表1分钟、1摄氏度甚至1个苹果。它为什么有这么多的表示意义?答案很简单,因为在本质上,它什么都不是,它就是数字1,一个记号,一个抽象的概念
为什么要使用freemarker
使用freemarker的初衷不是为了将业务逻辑和表现层分离吗?但是为什么freemarker中还是存在业务逻辑的语句呢,比如if/else,那直接用jsp不是也可以。而且用了freemarker我觉得要美化页面也很费力啊,同样有很多类似jsp页面中乱七八糟的标签的东西,感觉也是很乱。rnfreemarker用处到底是什么啊?
为什么要使用MQ?
新项目里要用MQ,但我对这个并不怎么感冒,觉得除了增加复杂度以外,没什么大的好处。rnrnIBM教材说的优点:MQ提供了用于应用集成的松耦合的连接方法,因为共享信息的应用不需要知道彼此物理位置(网络地址);不需要知道彼此间怎样建立通信;不需要同时处于运行状态;不需要在同样的操作系统或网络环境下运行。rnrn但是要实现信息共享,用数据库不就可以了吗?!以上的优点不是都能满足吗rnrn还请高人指点!
为什么要使用数据库
想找个理由说服自己 我们为什么要使用数据库?rnrnrn我就想硬盘上存的数据 不能直接使用吗 干嘛非得再去弄个数据库,多此一举?rnrnrn要是硬盘管理数据的效率足够高 是不是数据库也该退出舞台?rnrnrn数据库始于文件管理系统!管理硬盘的难道不是文件管理系统?如果是的话!假设文件管理系统性能足够优越,数据库是不是也该......rnrn这个问题始于JDBC,呵呵,可以说是JDBC引发的争议。rnrn今天学习结论:rnrn大胆假设:JBDC和java.sql+javax.sql其实是一套东西?小心求证:我选择是!rnrnJDBC是一套接口,服务提供商提供数据库驱动,即提供重写接口后的类(实现类),调用的时候当然调用提供商的类了,以及重写后的方法。因为只有他们提供的类才可以实例化,接口可不行。rnrn欢迎大家批评指正.....
为什么要使用变量?
这个对话框程序为什么要使用变量呢?直接使用这个函数弹出消息不就行了吗?rnvarrn ret:word;rnbeginrnret:=messagedlg('使用函数',mtconfirmation,mbyesnocancel,0);rnend;rn
为什么要使用getchar?
在这个程序中【基本题】有三个整数a、b、c,由键盘输入,输出其最大的数。rn我想问下为什么最后要 使用getchar(),有什么用吗?还是本身就是多余错误的?rn#include rnrn/*rn* 返回 3个整数的 最大值 rn*/rnint max(int a, int b, int c)rnrn int temp = 0;rn a > b ? temp = a : temp = b;rn c > temp ? temp = c : temp = temp;rn return temp;rnrnrnint main()rnrn int a;rn int b;rn int c;rn printf("请输入3个整数(如:3 14 36) : \n"); rn scanf("%d%d%d", &a, &b, &c);rn printf("最大的数为:%d\n", max(a, b, c));rn getchar();rn getchar(); //??????????????为什么要使用rn return 0;rn
为什么要使用泛型
在程序中泛型与使用数组有什么区别?泛型是指定类型,数组也可以指定类型;泛型可以指定类为数据类型,数组也是可以的啊,只不过要循环new一下就行了啊。那为什么还要使用泛型?
为什么要使用调色板?
不用调色板建立刷子rnCBrush brush;rnbrush.CreateSolidBrush(RGB(123,234,203));rnpDC->SelectObject(&brush);rnrn用调色板建立刷子rnpDC->SelectPalette(&m_Palette, FALSE);rnpDC->RealizePalette();rnCBrush brush;rnbrush.CreateSolidBrush(PALETTERGB(123,234,203));rnpDC->SelectObject(&brush);rnrn这两种方法有什么差别呢,为什么要使用调色板呢?
为什么要使用内部类
RTrn看有的提到说是rn1.“控制框架”。rn2.像C++样,实现“变相”的多继承。rn很迷惑~
为什么要使用jQuery
一、什么是jQueryjQuery是一套JavaScript的库,它简化了使用JavaScript进行网页特效开发的一些复杂性,提供了对常见任务的自动化和复杂任务的简化。使用jQuery不仅能够将原本需要很多JavaScript代码才能实现的功能缩减为几行代码,而且提供了足够高速的性能。二、为什么要使用jQuery举个栗子,假设我们现在有以下基本网页:<!DOCTYPE html> &...
为什么要使用卷积
整理并翻译自吴恩达深度学习系列视频:卷积神经网络1.11。 为什么要使用卷积 假设你有32X32X3的图像,一共3072个特征点,卷积成28X28X6的图像,一共4704个特征点。如果使用传统的网络,你需要3072*4704 ≈\approx≈ 14M个参数。 32X32X3的图像已经是很小的图像了,如果你是1000*1000,参数可能多到使得计算举步维艰。 卷积的优点 参数共享:一个特...
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数