最近整理的都是一些小Tip,充数也发上来,希望对大家有所帮助。
前几天在做一个功能时,需要创建一个临时的小数据库Schema,并在程序的最后将此Schema删除,在删除的时候总是提示“ORA-01940: cannot drop a user that is currently connected”,由于程序比较简单,我很确信自己已经关闭了所有连接,甚至Connection对象也都调用了Dispose()。
后来怀疑是连接池机制造成的问题,查了一下资料:除非在connection string中明确说明,否则总是默认是启用连接池机制的。
也就是说,当一个连接对象被关闭甚至Dispose(),它并未在物理上被释放,而是统一还给连接池保存,以便后续使用。这样在数据库里通过查询v$session视图,连接还是存在的。删除些用户时自然就会出现ORA-01940错误。
解决的方法是调用静态方法OracleConnection.ClearPool(conn)清除连接池中的此连接。