[求助]困扰已久的问题,WEB程序提示连接数据库出错!

[复制链接]
查看11 | 回复9 | 2011-12-28 08:44:39 | 显示全部楼层 |阅读模式
本来这个问题不应该在这个版本问的,但是在其他地方问,我觉得解决不了问题。而且,我觉得这个问题可能会跟数据库管理挂钩的。
问题是这样的:在本地,我有一个WEB服务器(TOMCAT)和数据库服务器A以及一个远程的数据库B,A连接B的数据库链接是lt_b。
一般情况下,web程序使用a上的数据,但是有时也会用到b上的数据。
我使用了连接池,


平时使用没什么问题。如果页面长时间没有操作,再次操作查询时,可能会出现如下错误:
ORA-02396: exceeded maximum idle time, please connect again
ORA-02063: preceding line from lt_b
或者
ORA-02068: following severe error from lt_b
ORA-01012: not logged on
我认为自己的程序是没有问题的。问题应该出在数据库链接之上。因为使用了连接池,web程序连接本地数据库可能是不会出问题的,而远程数据库链接就可能存在问题,超过一定时间没有操作,它是出现最大等待时间、没有登录等情况。
不知道这种情况有没有办法解决?
----------------------------------------------------------------------------------------------
网页上显示的错误信息:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: javax.servlet.ServletException: java.sql.SQLException: ORA-02396: exceeded maximum idle time, please connect again
ORA-02063: preceding line from LT_B

org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
javax.servlet.ServletException: java.sql.SQLException: ORA-02396: exceeded maximum idle time, please connect again
ORA-02063: preceding line from LT_B

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)

org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)

org.apache.jsp.user_005fhis.phone_005fnum_005finfo_005fbg_jsp._jspService(phone_005fnum_005finfo_005fbg_jsp.java:140)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
java.sql.SQLException: ORA-02396: exceeded maximum idle time, please connect again
ORA-02063: preceding line from LT_B

oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)

oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)

oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)

oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)

oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)

oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790)

oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038)

oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830)

oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133)

oracle.jdbc.driver.OracleStatement.doScrollExecuteCommon(OracleStatement.java:4056)

oracle.jdbc.driver.OracleStatement.doScrollStmtExecuteQuery(OracleStatement.java:4196)

oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1280)

org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)

zcall.DB.executeQuery(DB.java:133)

org.apache.jsp.user_005fhis.phone_005fnum_005finfo_005fbg_jsp._jspService(phone_005fnum_005finfo_005fbg_jsp.java:76)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

[ 本帖最后由 ShingU 于 2009-1-22 18:19 编辑 ]
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
这个问题太简单了,大家不屑于回答?
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
removeAbandonedTimeout="60" --> 这个参数的设置,会让连接池把超过60s的connection remove掉的。更何况你所说的“如果页面长时间没有操作”,那时你的connection已经不存在了
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
这个是因为碰到我所说的问题,然后从网上找来的,不管有没有用,就添上去了。
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
再看看
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
想到一个笨办法,就是把所用到的远程数据表都复制到本地来。
够笨的吧?


回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
原帖由 ShingU 于 2009-1-22 18:17 发表
想到一个笨办法,就是把所用到的远程数据表都复制到本地来。
够笨的吧?


如果对实时要求不高,把远程的数据同步到本地更可靠吧
[ 本帖最后由 mulanboy 于 2009-1-23 09:39 编辑 ]
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
原帖由 mulanboy 于 2009-1-23 09:38 发表

如果对实时要求不高,把远程的数据同步到本地更可靠吧

我是实在不想那么做的。因为一来表的数量众多,全部拷贝下来,会比较繁琐,而且数据量比较大,本地的存储空间有限。二来有部分数据的实行性要求还是挺高的。
另外,我想知道,是什么原因导致这种情况?是远程数据库自己的保护措施引起的?
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
改远程db的超时设置行吗
回复

使用道具 举报

千问 | 2011-12-28 08:44:39 | 显示全部楼层
原帖由 lixunpeng 于 2009-1-23 17:12 发表
改远程db的超时设置行吗

如何改才合适呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行