写了一个关于策略的自动处理模块,用到了java多线程;
其中数据库连接在多处获取,释放很麻烦;
采用一种方法解决了。
{有人踩了,可能是没耐心看完代码吧,那我就叙述一下:
1、把线程方法内用到的链接全部提取出来,用参数传入
2、在线程方法外初始一条链接传入。(参考方法:makeSmS())
}
供自己以后参考。
函数调用代码:
//start
TimerThead o= PStack.timerMap.get(code);
if(o!=null){
o.TimerStop();
PStack.timerMap.remove(code);
}
Send_strategy strategy=StrategyUtil.getDate(code);
if(strategy.getSMS_SEND()==1){
TimerThead tt=new TimerThead(code,StrategyUtil.getYanchi(strategy),strategy.getRATE());
tt.TimerStart();
PStack.timerMap.put(code,tt);
}
//end
简单定时器代码:
package com.towery.sms.strategy;
import java.util.Timer;
import java.util.TimerTask;
public class TimerThead{
//简单定时器
public Timer timer= new Timer();
private String code;
private int yanchi;
private int pinlv;
//构造方法,传递参数
public TimerThead(String code,int yanchi,int pinlv){
this.code=code;
this.yanchi=yanchi;
this.pinlv=pinlv;
}
/***
* 停止 Timer
*/
public void TimerStop(){
//对应线程停止
timer.cancel();
}
/***
* 开始Timer
*/
public void TimerStart() {
timer.schedule(//参数: 任务,延迟,频率;
new TimerTask() { //TimerTask 继承了Runnabel接口。启用了新的线程
public void run() {
SmsThread st=new SmsThread(code);
st.start();
}
}
,yanchi *60 * 1000,pinlv * 60 * 1000);
}
/**
* main
* @param args
*/
public static void main(String[] args) {
// //start
// TimerThead o= PStack.timerMap.get(code);
// if(o!=null){
// o.TimerStop();
// PStack.timerMap.remove(code);
//
// }
// Send_strategy strategy=StrategyUtil.getDate(code);
// if(strategy.getSMS_SEND()==1){
// TimerThead tt=new TimerThead(code,StrategyUtil.getYanchi(strategy),strategy.getRATE());
// tt.TimerStart();
// PStack.timerMap.put(code,tt);
// }
// //end
}
}
线程类代码:
package com.towery.sms.strategy;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import com.towery.DateUtil;
import com.towery.flowinfo.SystemBus;
import com.towery.flowinfo.bean.Send_strategy;
import com.towery.sms.helper.Receiver;
public class SmsThread extends Thread{
private String code;
public SmsThread(String code){
this.code=code;
}
/***
* 线程入口
*/
public void run() {
makeSmS(code);
}
/***
* 发送短信
* @param code
*/
private void makeSmS(String code){
//时区矫正
TimeZone tz = TimeZone.getTimeZone("ETC/GMT-8");
TimeZone.setDefault(tz);
Connection conn = SystemBus.getConnection();
try{
//获取策略数据
Send_strategy strategy=StrategyUtil.getDate(conn,code);
//获取并编辑发送对象及内容
Map contentMap= getSms(conn,code, strategy);
//解析并发送
doWrite(conn,code,contentMap);
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
/***
* 获取短信和收信人信息
* @param code 策略编码
* @param strategy 策略
* @return map<code,list> << lst:<receivers,content>
*/
private Map getSms(Connection conn,String code,Send_strategy strategy){
Map map=new HashMap();
Statement st = null;
ResultSet rs = null;
String sqlCount="";
String content="";
try{
if("MRQKSB".equals(code)){
...
List<Receiver> receivers=getReceivers(conn,"","2");
List pageLst=new ArrayList();
pageLst.add(content);
pageLst.add(receivers);
lst.add(pageLst);
}
map.put(code,lst);
}else if("PFQYKCCLBJ".equals(code)){
sqlCount =getSql(code);
...
List<Receiver> receivers=getReceivers(conn,l0,"0");
List pageLst=new ArrayList();
pageLst.add(content);
pageLst.add(receivers);
lst.add(pageLst);
}
map.put(code,lst);
writeAlarm(conn,"0",strLst);
}else if("PFQYSBTX".equals(code)){
...
List<Receiver> receivers=getReceivers(conn,l0,"0");
List pageLst=new ArrayList();
pageLst.add(content);
pageLst.add(receivers);
lst.add(pageLst);
}
map.put(code,lst);
}else if("LSDWKCCLBJ".equals(code)){
...
List<Receiver> receivers=getReceivers(conn,l0,"1");
if(receivers.size()<1){
break;
}
List pageLst=new ArrayList();
pageLst.add(content);
pageLst.add(receivers);
lst.add(pageLst);
}
map.put(code,lst);
writeAlarm(conn,"1",strLst);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if(rs!=null){
rs.close();
rs=null;
}
if(st!=null){
st.close();
st=null;
}
// if(conn!=null){
// conn.close();
// conn=null;
// }
} catch (SQLException e) {
e.printStackTrace();
}
}
return map;
}
/***
* 记录 频发单位、零售、超量报警
* @param type 0是公司 company 1是零售 station
* @param content
*/
private void writeAlarm(Connection conn,String type,List content){
...
}
/***
* 获取收信人信息
* @param comCode 对应编码
* @param type =0 公司code ; type=1 零售单位code ;2=报数对象
* @return
*/
private List<Receiver> getReceivers(Connection conn,String comCode,String type){
...
return lst;
}
/***
* 拼凑短信并完成发送
* @param code 对应code
*/
private void doWrite(Connection conn,String code,Map map) {
...
}
private void writeSMS(Connection conn,List<Receiver> rLst,String content){
...
}
}
分享到:
相关推荐
5. 强大的类库支持:Java 提供了庞大的标准类库和第三方类库,涵盖了常见的开发需求,包括文件处理、网络通信、多线程、数据库连接、图形用户界面等。这些类库使得Java开发人员能够更高效地开发应用程序。 6. 安全...
5. 强大的类库支持:Java 提供了庞大的标准类库和第三方类库,涵盖了常见的开发需求,包括文件处理、网络通信、多线程、数据库连接、图形用户界面等。这些类库使得Java开发人员能够更高效地开发应用程序。 6. 安全...
百度百科多线程爬虫Java源码,数据存储采用了Oracle11g 简介 采用了MyEclipes作为集成开发环境,应该是兼容的eclips 使用方法 下载此原始代码后使用(导入或导入)操作导入此项目 各个类介绍 HtmlDAO.java 主要是...
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...
52.8. 有几种开源的数据库连接池: 29 53. 描述一下JVM加载class文件的原理机制? 30 54. socket编程 30 54.1. 什么是TCP/IP、UDP? 30 54.2. Socket在哪里呢? 31 54.3. Socket是什么呢? 32 54.4. socket的实现步骤...
在Oracle数据库中,数据库的操作模式分为专用服务器(DELICATED SERVER)模式和多线程服务器(MULTITHREADED SERVER)模式两种。其中,在专用服务器模式中为每个用户进程创建一个服务器进程,用户进程与服务器进程之间...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
(1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...
5. 强大的类库支持:Java 提供了庞大的标准类库和第三方类库,涵盖了常见的开发需求,包括文件处理、网络通信、多线程、数据库连接、图形用户界面等。这些类库使得Java开发人员能够更高效地开发应用程序。 6. 安全...
也讲述了与Java 1.1的“Java数据库连接”(JDBC)和“远程方法调用”(RMI)有关的问题。 <br>(16) 第16章 设计范式 本章将讨论非常重要、但同时也是非传统的“范式”程序设计概念。大家会学习设计进展过程的...
实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 191 实例148 使用事件分配线程...
用来建立数据库连接的唯一服务名。如果要在没有调度程序的情况下仍能连接到数据库, 请将该值设置为与例程名相同。此参数自 8.1.3 版起已废弃。 值范围: 根据操作系统而定。 默认值 :0 mts_sessions: 说明 : 指定...
第8章Java的多线程机制266 8.1线程的概念266 8.1.1多线程的特点266 8.1.2线程的状态267 8.2Thread类268 8.2.1Thread类的构造方法268 8.2.2Thread类的常用方法268 8.3多线程程序的编写269 8.3.1利用Thread的...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
§3.5.5 JAVA脚本 81 第6章 性能优化基础知识 82 §5.1 理解ORACLE性能优化 82 §5.1.1 响应时间与吞吐量的折衷 82 §5.1.2 临界资源 83 §5.1.3 过度请求的影响 83 §5.1.4 调整以解决问题 83 §5.2 优化的执行者 ...
D) 在Java中,最多使用的是抽象类,因为应用抽象类也可以实现多继承。而接口已经被限制使用。 题目21:d 程序如下: interface Eo { double PI=3.1415926; } abstract class A { void shot() { System.out....
TCP的连接和释放过程 什么是长连接和短连接 长连接是如何实现的 计算机网络体系结构 谈谈你对Struts的理解。 谈谈你对Hibernate的理解。 谈谈你对Lucene和solr的理解 谈谈你对ActiveMQ的理解 Spring的IOC,DI和AOP ...