之前,同事写了一个单表查询带排序,但是调用多了之后,直接把Oracle数据库搞挂了。按理说Oracle这个东西不可能这么脆弱,10几个线程去连接跑查询就把它hang住,连接都连接不上。
一开始我们怀疑是数据库连接池的原因,排查之后看到应用配置的数据库连接池的大小并不大,不会引起Oracle数据库连接池的问题。然后,DBA在后台查看到的情况是,这边一启动多线程去做数据库查询,就导致Oracle的临时表空间被耗尽。在经过了详细排查后发现,这是一个Oracle本身的bug。
原因是,查询字段中有CLOB类型的字段,在多线程读取时,保存了多个副本,而且排序会导致这些副本的大小远远大于其本身大小,这样就耗尽了临时表空间。
解决,就是先查询和排序关键字段,后面在把CLOB字段查出。
comments powered by