请教ibats2连接池和tomcat6优化问题
今年过来接手某城市的交通卡对外查询系统的开发,功能简单,只需输入卡号,取得余额信息即可。采用的是ibatis2+tomcat6+oracle10,代码简单。
??? 这个系统的访问量大(具体多少,我也不知道),某一段时间的访问量时多时少等不确定因素。
??? 开始的时候,用的是ibatis2的SIMPLE连接池,经常出现的问题是,tomcat启动后,访问一段时间,出现JSP页面无法访问,甚至连静态页面都无法打开,重启tomcat后就可以正常查询,过一段时间又发生那样的问题,后来就优化了tomcat,内容如下:
??? <Connector port="8088" protocol="HTTP/1.1"
?????? maxThreads="500"??
?????? minSpareThreads="50"??
?????? maxSpareThreads="150"??
?????? acceptCount="100"????????
?????? connectionTimeout="20000"
??? redirectPort="8443" />
??? 这样也无济于事,后来参考把SIMPLE连接池改成DBCP连接池,同时tomcat的优化保留,ibatis的DBCP连接配置如下:
???? <settings
??????? cacheModelsEnabled="true"
??????? enhancementEnabled="true"
??????? lazyLoadingEnabled="true"
??????? errorTracingEnabled="true"
??????? maxRequests="400"
??????? maxSessions="350"
??????? maxTransactions="1"
??????? useStatementNamespaces="false" />
??????? <transactionManager type="JDBC">
??????????? <dataSource type="DBCP">
??????????? <property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />
??????????? <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@IP:端口:XXX" />
??????????? <property name="JDBC.Username" value="XXX" />
??????????? <property name="JDBC.Password" value="XXX" />
??????????? <property name="Pool.MaximumActiveConnections" value="400" />
??????????? <property name="Pool.MaximumIdleConnections" value="200" />
??????????? <property name="Pool.MaximumWait" value="10000" />
?????? <!-- <property name="Pool.ValidationQuery" value="select * from ACCOUNT"/>? -->
??????????? <property name="Pool.LogAbandoned" value="false"/>
??????????? <property name="Pool.RemoveAbandoned" value="true"/>
??????????? <property name="Pool.RemoveAbandonedTimeout" value="90"/>
??????????? </dataSource>
??????? </transactionManager>
??? 这样的配置之后,有点效果,tomcat启动后,一段时间(不到一天),总是出现无法查询,但是和之前不同的是,JSP页面什么时候都可以打开的,并且速度很快,只是查不出数据,重启tomcat后就好了,过一段时间有发生这样的事情,报错的方法如下:
??? public List getBiact(String cardno) {
??????? // 首先初始化iBatis获得一个SqlMapClient对象
???????? SqlMapClient sqlMap = null;
??????? List biactList = null;
??????? try {
??????????? sqlMap = DB.GetSqlMap();
?? // sqlMap系统初始化完毕,开始执行getAllUser操作
??? biactList = sqlMap.queryForList("getBiact", cardno);
??? sqlMap.endTransaction();
??? if (biactList.size() == 0) {
??????? sqlMap.queryForList("biact_ex", "");
??? } else {
sqlMap.queryForList("success", "");
???? }
} catch (Exception e) {
??? System.out.println(e.getMessage());
??? back = "系统繁忙,请您稍候重试!";
??? try {
sqlMap.queryForList("biact_ex", "");
??? } catch (SQLException e1) {
e1.printStackTrace();
??? }
}
???
??? 报出的错误是: 系统繁忙,请您稍候重试!
??? 查询语句是简单的两表联合查询,都有索引(不过每天清晨都定时的从另一个数据库把数据导入我要查询的那个表中,数据量大概会有500W条左右,这个是后台程序执行,在导入过程中,会把当前查询的主表的索引删掉,导完后再重建,正常情况下,大概两到三个小时就会把数据导完,错误的发生都在数据导完且索引重建好之后)。
??? 由于小弟工作经验不足,之前也没接触这种高访问量的系统,我没法可师了,总是出现这样的问题,我很有压力,请各位同行指教一下,谢谢!?
????
???