今天遇到了一个很奇怪的问题。
检索一个表,因为这个表非常的大,用到分区表循环检索,一共循环1056次。
使用了多线程之后,如果把检索数据库的方法设置为synchronized,那么每次执行完PreparedStatement之后调用PreparedStatement.close()就会关闭open_cursor。
如果把synchronized去掉。那么调用PreparedStatement.close()之后,open_cursor没有被关闭掉。达到最大游标数后报错。
有人遇到过这个问题吗?如何解决的?

解决方案 »

  1.   

    代码,你的pstmt不会是成员变量吧。线程不安全咯!
      

  2.   

    当你多个线程,如200个,同时进入那个方法,可不就需要200个cursor么
      

  3.   

    代码的框架里层数太多了。
    CONNECTION是同一个(框架里写的不能改)。每个pstmt是在调用检索方法的时候创建的
      

  4.   

    我使用的是线程池,保持100各线程,如果每个线程执行检索后关闭cursor的话,那最多只能有不超过100个cursor。现在不是,会一直增长。
      

  5.   

    看样子是资源泄漏,可以肯定是代码上的问题!造成这样的原因基本是 Connection 或者 PreparedStatement 被多个线程所共享了。数据库的三个对象 JDBC 规范没有规定必须得是线程安全的,因此 JDBC 的 provider 并不会将其实现为线程安全的,因此在使用时应把这三个对象保持在成员变量的范围内,如果确定要弄成成员变量被多个线程所共享的话,那在线程同步上需要做精心地控制。这种控制对于应用开发人员来说是非常困难的。