一、服务器环境:suse操作系统,IBM WebSphere,oracle数据库。平台有一个短信发布系统。平台内外网隔离,数据通过网闸同步。该webService用来提供其他系统短信发送以及查询短信状态使用。
二、最初设计:其他系统调用接口-->插入短信管理表-->触发器生成短信发送表-->网闸同步到外网-->外网短信发送程序发送短信-->网闸将发送状态同步到内网短信发送表,再将短信发送管理表和短信发送表用视图关联将合适的数据返回给其他系统。
补充:由于内外网隔离,采用第三方网闸软件,内网数据变动(增删改)时会同步到外网,外网有变动时也是同步到内网。
三、历程
开始测试时,当短信发送了20多条的时候开始出现没有收到短信,有的要大约30分钟才能收到。到数据库查看发现没有插入数据库。查看was日志发现有线程挂起,赶紧重启应用,was节点。后来多次观察发现有时候挂起的线程会释放,不过还是危险性太高,将整个平台弄瘫就不合算了。
这块是自写了一个数据库连接池,代码如下:
private static DataSource setupDataSource() {
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName(DBDRIVER);
bds.setUrl(DBURL);
bds.setUsername(DBUSER);
bds.setPassword(DBPWD);
bds.setInitialSize(10);
bds.setMaxActive(30);
return bds;
}
和同事讨论了一下,怀疑是吧数据库连接池用光了,但是还能用pl/sql连上数据库,那数据库连接应该是能用光。但是上面代码中红色部分总归是问题,每调用setupDataSource一次就就会产生一个新的连接池。因此将代码改为:
private static BasicDataSource bds = new BasicDataSource();
static{
bds.setDriverClassName(DBDRIVER);
bds.setUrl(DBURL);
bds.setUsername(DBUSER);
bds.setPassword(DBPWD);
bds.setInitialSize(10);
bds.setMaxActive(30);
}
public static DataSource setupDataSource() {
return bds;
}
问题依然存在,又看保存方法中connection为静态类成员变量又怕没有及时关掉或者并发太多时会串掉
,又将connection改为方法变量,预料中问题依然存在,后来又改为was数据库连接池,修改为was连接池的时候又遇到一些问题,就是jndi的名字,本来配置的时候就没有jdbc/开头或者jndi/开头,又自作聪明的加上了,结果又报错没有找到was数据库连接池
。但是问题依然存在。
此时感觉到可能是数据库方面的问题。又仔细看了日志,报
java.net.SocketInputStream.socketRead0
java.net.SocketInputStream.read
网上有查了一下,晕,原来是数据库有死锁。结果仔细观察发现是网闸会时不时的放出一个锁,在更新时最为频繁,而且在其他系统新增后接着查询状态100%会报错,然后先将查询注释,虽然少了但是依然存在。一想查询的是视图,也就2个表关联,也不应该会这样。
既然锁会对频繁操作有影响,而网闸又不可能又修改。只能牺牲短信的实时性,增加定时器,删除触发器。每2分钟从短信业务表中取数据插入短信发送表。总算没事了
但是,半天之后又发现被锁死了。没办法只好又加入判断,如果有锁,则不做任何操作。虽然有时候要20min短信才发出去,但是至少线程挂起是没有了,而且短信都是通知类型的,延时也不影响。
经过这次经历发现:
1、看日志时一定要细心,如果第一次就发现数据库有锁, 就不会浪费大约3天时间(不是全天候,中途还有其他事处理)时间。
2、对数据量连接池配置有了更深的了解
3、最重要的是在系统设计初期,一定要弄清楚需求,考虑要长远。不能来一个需求加一个功能。这样会死人的。
附加:
java连接was连接池代码:
public Static Connection getConn(){
Connection con = null;
DataSource ds = null;
try{
if(null==ctx){//ctx为类变量,定义 略
try{
ctx=new InitialContext();
}catch(NamingException e){e.preintStackTrace();}
}
try{
ds=(DataSource)ctx.lookup("wasDateDB");
}catch(NamingException e){e.preintStackTrace();}
con=ds.getConnection();
}catch(SQLException e){shutdownDataSource(ds);e.preintStackTrace();}
return con
}
oracle查看锁
select
t2.username,t2.sid,t2.serial#,t2.logon_time
from
v$locked_object t1,v$session t2
where
t1.session_id
=
t2.sid
order
by
t2.logon_time;
杀锁:
alter system kill session 'sid,serial#';
如果大家有遇到过类似的问题请告知。谢谢!
分享到:
相关推荐
在IT行业中,尤其是在移动应用开发领域,连接数据库是常见的需求之一。本篇文章将详细探讨如何在Android平台上通过WebService实现与SQL Server数据库的交互。 WeberService作为一种远程服务调用技术,常用于不同系统...
在.NET项目中,利用JavaScript(JS)调用Web Service连接数据库是一种常见的前后端交互方式,尤其是在构建Web应用程序时。这个项目展示了如何通过JS与后台的Web Service进行通信,实现用户登录、信息查询、列表显示...
Delphi7 是一款功能强大且广泛应用的开发工具,在开发 WebService 时,经常需要与数据库进行交互,以获取或存储数据。在本文中,我们将详细介绍 Delphi7 下开发WebService 如何使用数据库进行交互。 Server 端 ...
在Delphi WebService中,需要定义一个可以被外部调用的方法来执行数据库查询操作。示例代码中定义了一个名为`Select`的方法。 ```pascal function Select: string; ``` 此方法返回一个字符串类型的值,表示查询...
本文档主要讲述的是silverlight 通过 WebService 连接数据库;silverlight 通过 WebService 连接数据库 实现对 DataGrid 的增删改查。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
在本实例中,我们将深入探讨如何使用C#语言来开发一个基于WebService的操作数据库的应用。 首先,理解WebService的基本原理是至关重要的。WebService基于SOAP(Simple Object Access Protocol)协议,通过HTTP协议...
解决这个问题通常涉及调整超时设置、优化服务性能、检查网络连接或采用重试策略等。 描述中提到的“AXIS2”是Apache软件基金会的一个开源Web服务框架,它用于部署和实现Web服务。AXIS2提供了高效的执行模型,支持...
从结构上看,Unity3D想要拿数据库的数据,问Web拿就可以了,而对数据库的操作已经外包给Web了,不用你操心。是的,理论上的东西看上去就是这么简单。Web对数据库的操作完全是没问题的,前提是大家如果会Asp.net,...
Delphi通过WebService访问数据库. 1.查询数据 procedure TForm1.Button1Click(Sender: TObject); var ls_Table: string; ls_Service: Service1Soap; begin ls_Service := Buf_GetBuleService; ls_Table := '...
【WebService/多数据库连接】是IT领域中一个重要的主题,主要涉及到如何在Web服务中灵活地连接和操作多种类型的数据库,如MySQL、SQL Server和Oracle。在这个项目中,开发者已经实现了一些基本的功能,并且提供了...
在Android应用开发中,连接后台数据库是常见的需求,通常我们通过Web服务(如WebService)来实现这一功能。本文将深入探讨如何在Android中利用WebService与后台数据库进行交互,以及这方面的扩展开发可能性。 首先...
本文将详细介绍如何在Android应用中利用WebService接口连接到SQLServer数据库,实现数据的增删改查操作。 首先,理解概念: 1. Android:Android是一种开源操作系统,主要用于移动设备,如智能手机和平板电脑。 2. ...
在这个项目中,我们看到了一个通过Web服务连接SQL数据库的实现方式,以及如何利用Android的布局管理器进行界面切换。以下是相关知识点的详细说明: 1. **Android登录界面**: - 使用Android Studio创建一个新的...
"利用webservice提供数据库服务"这一标题表明了我们要探讨的主题是通过Web Service技术来实现对数据库的操作。Web Service是一种基于互联网的、能够进行交互的软件应用,它允许不同系统间的应用程序共享数据和服务。...
本篇文章将详细探讨如何使用C#通过WebService来连接Oracle 9i数据库,以实现无需在运行C#程序的计算机上安装Oracle客户端即可进行数据操作。 首先,理解WebService的基本概念至关重要。WebService是一种基于Web的、...
### BCB调用WebService方法详解及常见问题排查 #### 一、引言 在现代软件开发中,跨平台服务通信已成为一种常态。其中,WebService作为一种常见的远程服务调用方式,在不同语言之间进行交互时扮演着重要的角色。...
WebService客户端调用服务器数据库是分布式系统中常见的交互方式,它允许客户端应用程序通过网络与服务器上的数据库进行通信。本文将深入探讨这一技术,并基于提供的标签“源码”和“工具”来解析实现这一功能的关键...
本篇文章将深入探讨如何使用Delphi WebService操作数据库,特别是读取数据库数据,这对于初学者来说是一个很好的入门点。 首先,我们需要了解Web服务的基本概念。Web服务是一种基于互联网的、平台无关的应用程序...
1. **创建数据库连接**:创建一个`SqlConnection`对象,并指定连接字符串。 2. **构造SQL语句**:构建一个删除SQL语句,使用`@id`参数化查询来指定需要删除的用户编号。 3. **执行SQL命令**:使用`SqlCommand`对象...