数据汇总问题,十万火急!!

santana1978 2004-10-12 10:40:52
我的系统有一个汇总程序,用来汇总全省所有市县局的报表数据,过程是先从已填报的报表里查询出数据,然后加总,再插入到一个新表里,这样的操作过程大概要做上百次,都在一个方法里面实现。
现在的问题是,每次做到一定数量市县的汇总后就报错:java.sql.SQLException: [Microsoft][SQLServer JDBC Driver]Error establishing,不知道什么原因,是不是资源没有释放?但是我的每一次数据库操作后都把Connection和Stament释放掉了,还要注意什么问题吗?
...全文
186 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
santana1978 2004-10-27
问题已解决,原来是连接池的问题,原来的连接池是自己写的,效率不高,后来用了weblogic的datasource取连接池,就可以了。
回复
ningIII 2004-10-13
你可以跟踪一下,在多少条的时候有异常~

然后再找原因,慢慢来~
回复
santana1978 2004-10-13
数据库连接是没有问题的,因为其他功能都正常,汇总也是可以,只是汇总到大半的时候会出现这个错误,我觉得应该是资源释放的问题,但是我查看了程序,ResultSet、Stament和Connection都及时释放了,还有其它东西吗?
回复
Drate 2004-10-13
1、你的用户认证方式是不是正确呀?不然Error establishing提示的就是认证错误了。有关的详细信息,你可以参见这个贴子:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200247
回复
w31415926 2004-10-13
具体没把你的代码看得很清楚,建议你可以查两个方面:
1。事务处理,你的程序里用到了事务处理,检查一下,在事务开始和结束之间到底对数据库做了多少事情,适当优化其中的数据库访问量,减轻数据库压力。
2。ResultSet是不是都及时释放了。
回复
LiGun 2004-10-12
详细一些
回复
yunxiang 2004-10-12
把你的sql写出来看看。
还有关键代码。
这样看不大懂。
回复
youthy_yy 2004-10-12
建议用临时表,你这样操作过程大概要做上百次可能会引发资源问题
回复
JavaFat 2004-10-12
顶。。。。。。
回复
santana1978 2004-10-12
由于业务比较复杂,用存储过程可能不太好,而且汇总规则是用户可配置的,会经常变
下面贴出主要用到的方法:
////////更新数据库:
public int _sqlExecuteUpdate(String _strSQLs[]) throws WIMException {
//System.out.println("begin _sqlExecuteUpdate()");
if (_strSQLs.length < 1) {
return 0;
}
Connection oConn = null;
Statement oStmt = null;
int i = -1;
int nRet = 0;
javax.transaction.UserTransaction tx =null;



try {
tx = (UserTransaction)ctx.lookup(tx_String);
tx.begin();
oConn = getConnection();
oStmt = oConn.createStatement();
for (i = 0; i < _strSQLs.length; i++) {
//System.out.println("i="+i+":"+_strSQLs[i]);
nRet = oStmt.executeUpdate(_strSQLs[i]);

}
tx.commit();
oStmt.close();
int j = nRet;
return j;
}
catch (Exception ex) {
try{
tx.rollback();
}catch(Exception te){
te.printStackTrace();
}

throw new WIMException(1000,
String.valueOf(String.valueOf( (new
StringBuffer("执行SQL语句失败")).append(i < 0 ? "" :":".concat(String.valueOf(String.valueOf(_strSQLs[0])))).append("(Application._sqlExecuteUpdate)"))),ex);
}
finally {
if (oStmt!=null)oStmt=null;
if (oConn != null) {
freeConnection(oConn);
}
}
}

//////查询数据:
public ResultSet _sqlExecuteQuery(String _strSQL) throws WIMException {
return _sqlExecuteQuery(_strSQL, 0);
}

public ResultSet _sqlExecuteQuery(String _strSQL, int _nMaxSize) throws
WIMException {
if (_strSQL.length() < 5) {
return null;
}
Connection oConn = null;
Statement oStmt = null;
ResultSet rsData = null;
javax.transaction.UserTransaction tx =null;
try {
tx = (UserTransaction)ctx.lookup(tx_String);
tx.begin();
oConn = getConnection();
oStmt = oConn.createStatement();
if (_nMaxSize > 0) {
oStmt.setMaxRows(_nMaxSize);
}
rsData = oStmt.executeQuery(_strSQL);
tx.commit();
}
catch (SQLException ex) {
try{
tx.rollback();
}catch(Exception te){
te.printStackTrace();
}
throw new WIMException(40,
"\u67E5\u8BE2\u6570\u636E\u5931\u8D25app._sqlExecuteQuery\uFF1ASQL=".
concat(String.valueOf(String.valueOf(_strSQL))),
ex);
}
catch (Exception ex) {
throw new WIMException(0,
"\u67E5\u8BE2\u6570\u636E\u5931\u8D25app._sqlExecuteQuery\uFF1ASQL=".
concat(String.valueOf(String.valueOf(_strSQL))),
ex);
}
finally {
if (oStmt!=null)oStmt=null;
if (oConn != null) {
freeConnection(oConn);
}
}
return rsData;
}

//////sql语句举例如下,都是一样的模式:
查询:
sql=SELECT SUM(dayData) AS [day], SUM(yearData) AS [year]
FROM reportData
WHERE EXISTS
(SELECT logid
FROM reportlog
WHERE reportlog.logid = reportdata.logid AND logOrder = '241' AND
ruleId IN (1627, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1831, 1833,
1835, 1837)) AND (contID = '24910')

回复
dengyin2000 2004-10-12
建议用存储过程!
回复
yangzuyu12 2004-10-12
sql语句问题
仔细查查你的sql有什么问题,不过看你的数据量这么大,不建议你这么做,应该分开来执行
回复
Tabalulu 2004-10-12
用连接池了吗?优化你的SQL server相关参数
回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告