被这个问题困扰了相当一段时间
系统启动后在IE下基本正常,在FF下多刷新几次,就会出现数据库连接的稀奇古怪的现象
先是执行DataAdaper.Fill命令后,出现DataSet.Tables[0]不存在的错误
继续执行,出现执行SQL操作报告数据库连接致命错误
再继续执行,不报错了,但是每次数据库查询返回的结果都不太怎么正常
一直怀疑是使用了系统Cache机制的原因,但想不通为什么IE就没问题
出现这个原因,是因为系统的很多逻辑被打散在各个IOC对象之间,如果这些逻辑全部自己创建数据库连接,则第一个会造成数据库连接过多,(例如一颗树的访问,有可能调用一个权限判定逻辑很多次,如果自己创建连接,则每访问一次都用掉一次连接,当然,创建的连接是从池里获取的,每次用完会返回给池里,对性能影响可能并不很高),第二则是在这些逻辑显然不在一个事务里了,如果出了错,是没法回滚的
解决的方式,是我把封装的数据库连接对象IDataProvider接口给缓存到了HttpContext.Current.Cache里,每个请求第一个获取时创建一个新的,请求结束时释放掉
今天再次测试了好一会后终于确认问题确实是Cache造成的,翻了下以前项目的代码,发现原来以前的项目是把数据库连接放到了HttpContext.Current.Items里,框架里缓存的写法和以前的项目写的并不太一样,但缓存起来的原理是一样的,只是编写这个功能时读以前代码读岔了,采用了原本的另一个放置到Cache的功能
旧版本的代码这个功能比较多的被用在ashx层上,业务逻辑层很少使用,而在我做某个项目时,因为发现旧框架里的一个隐患BUG,有个类没释放数据库连接导致系统会出现无法访问数据库的问题,禁止了开发人员使用这个功能的封装
修改了一下代码,再测试,果然没问题了......
看起来似乎是因为系统资源不足时会自动释放掉缓存里的东西的原因么?可能FF有什么机制导致缓存更新的很快么?