这个问题出现有几天了,先详细描述一下现在的情况。
java实现了一个报表系统,其中有张日报表,所用的数据来源于一个存储过程处理之后的结果。存储过程如下:

USE[mrsdb]
GO
/******对象:StoredProcedure[dbo].[NEW_P_BRANCH_DAY]脚本日期:07/19/201109:12:27******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO

ALTERPROCEDURE[dbo].[NEW_P_BRANCH_DAY]
@DTVARCHAR(8),
@INST_CODEVARCHAR(11),
@RESULTINTOUTPUT
AS
SET@RESULT=0
BEGINTRY
BEGINTRANSACTION

DELETENEW_REP_BRANCH_DAYWHEREINST_CODE=@INST_CODEANDCLEAR_DATE=@DT


INSERTINTONEW_REP_BRANCH_DAY(
INST_CODE,MERCH_ID,MERCH_NAME,TRADE_COUNT,TRADE_AMOUNT,SHOUXU_FEE,TRADE_JING_AMOUNT,
KAIHU_BANK_NAME,KAIHU_MERCH_NAME,PAN,JIESUAN_BANK,FLAG,CLEAR_DATE
)
selectdistinct@INST_CODE,kk.merchid,
kk.merchname,
kk.tradecount,
kk.tradeamount,
kk.shouxufee,
kk.tradejingamount,
kk.kaihubankname,
kk.kaihumerchname,
kk.pan,
kk.jiesuanbank,
kk.flag,
kk.cleardate
from(
selecta.merch_idasmerchid,
c.MERCH_NAME_CN_EXasmerchname,
c_count+d_countastradecount,
c_amount-d_amountastradeamount,
fee_c_amt-fee_d_amtasshouxufee,
set_c_amt-set_d_amtastradejingamount,
casewhena.feature='1'andb.debit_card_acct_type='0'thenf.sa_rsv_data8
whena.feature='1'andb.debit_card_acct_type='1'thenf.sa_rsv_data7
whena.feature='2'andb.credit_card_acct_type='0'thenf.sa_rsv_data8
whena.feature='2'andb.credit_card_acct_type='1'thenf.sa_rsv_data7
whena.feature='3'andb.semi_credit_card_acct_type='0'thenf.sa_rsv_data8
whena.feature='3'andb.semi_credit_card_acct_type='1'thenf.sa_rsv_data7
whena.feature='4'andb.prepaid_card_acct_type='0'thenf.sa_rsv_data8
whena.feature='4'andb.prepaid_card_acct_type='1'thenf.sa_rsv_data7
endaskaihubankname,

case whena.feature='1'andb.debit_card_acct_type='0'thenc.settle_acc_name2
whena.feature='1'andb.debit_card_acct_type='1'thenc.settle_acc_name
whena.feature='2'andb.credit_card_acct_type='0'thenc.settle_acc_name2
whena.feature='2'andb.credit_card_acct_type='1'thenc.settle_acc_name
whena.feature='3'andb.semi_credit_card_acct_type='0'thenc.settle_acc_name2
whena.feature='3'andb.semi_credit_card_acct_type='1'thenc.settle_acc_name
whena.feature='4'andb.prepaid_card_acct_type='0'thenc.settle_acc_name2
whena.feature='4'andb.prepaid_card_acct_type='1'thenc.settle_acc_name
endaskaihumerchname,

casewhena.feature='1'thenb.debit_card_acct
whena.feature='2'thenb.credit_card_acct
whena.feature='3'thenb.semi_credit_card_acct
whena.feature='4'thenb.prepaid_card_acct
endaspan,
casewhenb.debit_card_flag='0'thenc.settle_bank2
whenb.debit_card_flag='1'thenc.settle_bankendasjiesuanbank,
a.flagasflag,
a.clear_dateascleardate
fromt_merch_sum_zrrxyt_featurea
leftjointbl_merch_accountb
ona.merch_id=b.merch_id
leftjoint_merchc
ona.merch_id=c.merch_id
leftjoin(selectdistinctd.merch_id,e.branch_name,d.sa_rsv_data8,d.sa_rsv_data7
fromt_merch_etdd,tbl_branch_infe
whered.I_CLEAR_BRANCH_INDEX=e.id)asf
ona.merch_id=f.merch_id
leftjoin(selectdistincti.merch_id,g.branch_name
fromt_merch_etdi,tbl_branch_infg
wherei.I_MNG_BRANCH_INDEX=g.id)ash
ona.merch_id=h.merch_id)askkwherekk.cleardate=@DT

UPDATENEW_REP_BRANCH_DAYSET
NEW_REP_BRANCH_DAY.INST_CODE_2=(REP_MERCH_BRANCH_REL.INST_CODE_1),
NEW_REP_BRANCH_DAY.INST_CODE_3=(REP_MERCH_BRANCH_REL.INST_CODE_2),
NEW_REP_BRANCH_DAY.INST_CODE_4=(REP_MERCH_BRANCH_REL.INST_CODE_3),
NEW_REP_BRANCH_DAY.INST_CODE_5=(REP_MERCH_BRANCH_REL.INST_CODE_4)
FROMREP_MERCH_BRANCH_REL
WHERENEW_REP_BRANCH_DAY.CLEAR_DATE=@DTANDNEW_REP_BRANCH_DAY.INST_CODE=@INST_CODEANDNEW_REP_BRANCH_DAY.MERCH_ID=REP_MERCH_BRANCH_REL.MERCH_ID

IF(@@ERROR<>0)
BEGIN
ROLLBACKTRANSACTION
END
ELSE
BEGIN
COMMITTRANSACTION
END
ENDTRY
BEGINCATCH
SET@RESULT=-1
ENDCATCH


这个存储过程每天执行一次,首先会把日期为当天的数据清除,再筛选数据插入NEW_REP_BRANCH_DAY这张表中。然后生成周报表时就直接从这张表中筛选一周的数据去处理,现在的问题是,每次跑完整个程序,在SQLSever活动监视器中这个程序的进程状态为睡眠,但打开的事物为1,应用程序为空,等待时间为0,CPU为3249147,物理IO为36682,内存为2,TCP/IP,阻塞者0,阻塞1.

该报表系统的程序是Timer实现的定时任务,每天固定时间执行一次,每天跑完之后程序不会关闭,等待下一次运行。

现在程序每天跑完之后,生成的日报表是正确的,也就是说从NEW_REP_BRANCH_DAY取到了存储过程筛选之后得到的当天的数据,但是我想去查询这张表中的数据时,Select*fromNEW_REP_BRANCH_DAY这个语句就一直被挂起,应该是这张表被锁住了。

之前为了成功执行Select*fromNEW_REP_BRANCH_DAY去验证当天的数据有没有被存进该表,我就把报表系统程序关了,关了之后是能执行Select*fromNEW_REP_BRANCH_DAY了,但是却没有当天的数据。这样在生成周报表时,就会因为没有那天的数据造成报表中数据不对。

之后我发现更诡异的事,就是如果我一直让报表程序运行,第一天跑完之后会卡住这个事务,NEW_REP_BRANCH_DAY表也是被锁住的,第二天跑完也是这个状态,但是当我在第三天跑完之后把报表程序关闭,执行Select*fromNEW_REP_BRANCH_DAY会发现第一天和第二天的数据都被插入到表中,但第三天的数据却丢失了。

问题详细描述就是这么多了,请各位大大帮帮忙,指教下是这是什么情况。。。在java代码或者存储过程中造成这种现在的原因可能有哪些。还有要说的一点就是java代码中的数据库连接模块是封装好的,有开就有关,存在数据库链接一直或者的可能。

5 个解决方案

#1


lz够辛苦的。

更多相关文章

  1. 利用纯真IP库建立mysql ip数据库
  2. Linux服务器安装php之后连接MySQL数据失败
  3. NoSQL_Cassandra_导出数据库结构/数据库结构还原
  4. 约束数据库表,以便只有一行可以在列中具有特定值
  5. 数据库截取字符串SUBSTR函数的使用
  6. 如何使用特定数据的所有可能实例填充数据表?
  7. odbc驱动程序不支持请求的属性VB6
  8. SQL服务器数据部分的年和月
  9. SQL Server 中 存储“经纬度”应设置的数据类型

随机推荐

  1. android imageView 图片显示方式属性
  2. android的异步加载与UI
  3. 【Gradle】Android Gradle 插件
  4. Android SDK Tools和Android SDK Platfor
  5. Android 面试题9
  6. Android四大图片缓存框架之-Fresco之init
  7. Android SDK Manager国内无法更新的解决
  8. android/java中短信pdu编码
  9. Android 之WebView
  10. android JNI 学习笔记1