写了一个关于策略的自动处理模块,用到了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){
...
}
}
分享到:
相关推荐
### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
在Java编程中,数据库连接池是一种管理数据库连接的机制,它允许程序在多个请求之间复用已打开的数据库连接,而不是每次请求时都创建新的连接。这样可以显著提高应用程序的性能,减少系统资源的消耗,并提供更可靠的...
在应用程序启动时,连接池会创建并存储一定数量的数据库连接,这些连接在应用程序运行期间可以被多个线程复用,避免了每次操作数据库时都需要创建新的连接。当一个线程需要访问数据库时,它会从连接池中获取一个已...
### Java 数据库连接池 C3P0 使用及参数详解:支持重连 在Java应用程序中,数据库连接池是一项关键的技术,用于管理与数据库的连接,提高应用的性能和响应速度。C3P0是一个开放源代码的JDBC连接池实现,它在内部...
1. **并发控制**:为了保证多线程环境下的安全性,需要使用线程同步机制,例如synchronized关键字,确保同一时刻只有一个线程能获取或释放连接。 2. **单例模式**:通常使用单例模式来实现连接池管理类,确保系统中...
数据库连接池是Java开发中非常重要的一个概念,它在处理大量并发访问数据库的应用场景中扮演着关键角色。本文将深入探讨数据库连接池的工作原理、重要性以及如何在Java中实现一个简单的连接池。 首先,数据库连接池...
总的来说,理解并实现一个简单的数据库连接池可以帮助我们更好地理解和利用这一技术,同时也能锻炼我们的多线程编程和设计能力。在实际项目中,结合maven和其他开源库,我们可以构建出高效、可靠的数据库连接管理...
数据库连接池是数据库管理中的重要组成部分,它在Java应用程序中扮演着优化数据库资源分配与管理的角色。本项目提供了一个轻量级的Java数据库连接池实现,旨在简化开发过程,提高应用性能并降低资源消耗。下面将详细...
Java数据库连接池(Java Database Connectivity Pool,简称JDBC连接池)是软件开发中用来管理和优化数据库连接的一种技术。它的核心思想是复用已存在的数据库连接,以减少创建和销毁连接时的开销,提高应用程序的...
Java JDBC 数据库连接池技术是Java应用程序访问数据库的关键优化手段,尤其在Web应用程序中,它解决了传统JDBC连接方式存在的效率低下和资源浪费问题。Java JDBC(Java Database Connectivity)是Java语言与各种...
数据库连接池,简单来说,就是一组预先初始化的数据库连接,这些连接被存储在一个“池”中,供多个应用程序共享。当应用程序需要与数据库交互时,它可以从池中获取一个已存在的连接,而不是每次都创建新的连接。使用...
Java数据库连接池是一种高效管理数据库连接的技术,它解决了在多用户环境下频繁创建和销毁数据库连接导致的性能下降和资源浪费问题。在Java中,虽然JDBC API并没有直接提供连接池的功能,但可以通过第三方库实现,如...
1. 并发问题:通过Java的synchronized关键字确保在多线程环境下的连接分配和回收操作是线程安全的。 2. 支持多数据库:通过配置文件存储不同数据库的信息,动态创建对应数据库的连接池。 3. 性能优化:通过调整连接...
在多线程环境下,每个线程可能有自己的`ResultSet`,需要正确管理并及时关闭,以释放系统资源。 7. **性能优化**:使用批处理(Batch Processing)可以一次性提交多个SQL语句,提高执行效率。此外,通过设置合适的...
1. **并发问题**:为了确保多线程环境下的安全,通常使用线程同步技术,如synchronized关键字,来保证连接的正确分配和释放。 2. **单例模式**:连接池管理类通常采用单例模式,以确保整个应用只有一个全局的连接池...
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
### Java中数据库连接池原理机制详解 #### 一、引言 在现代软件开发中,尤其是在基于Java的应用程序中,数据库连接池技术是一项至关重要的技术。它能够显著提高应用程序访问数据库的效率,减少资源消耗,并简化...
Java中的数据库连接池是优化数据库访问效率的关键技术之一。它主要解决了频繁创建和关闭数据库连接导致的性能损失和资源浪费。下面将详细讲解数据库连接池的原理和机制。 1. **连接池的基本工作原理** - **资源池...