用DataSource访问AS400上的DB2的一个表,如果访问两次,就会看到这个表处于文件Open状态,也就是说,表被锁了。
如果用JDBC直连(不用连接池),访问完表就关闭连接,是没有此现象的。
我的程序有什么问题,导致表被锁呢?代码如下:
////////////////////////////////////////
Context ictx = new InitialContext();
DataSource ds = (DataSource) ictx.lookup("java:comp/env/jdbc/as400");
Class.forName("com.ibm.as400.access.AS400JDBCDriver");
con = ds.getConnection();
DatabaseMetaData dbmd = con.getMetaData(); sql = "select * from testdb.TABA ";
st = con.createStatement();
rs = st.executeQuery(sql);
        ... ... rs.close();
st.close();
con.close();
////////////////////////////////////////server.xml:
////////////////////////////////////////  <Resource name="jdbc/as400" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="100" username="UserXXX" password="PSWXXX" driverClassName="com.ibm.as400.access.AS400JDBCDriver" url="jdbc:as400://ASXXXX;translation isolation =CS;date format=iso;libraries=LIBXXXX;translate binary=true" removeAbandoned="true" removeAbandonedTimeout="1" validationQuery="" /> 
////////////////////////////////////////web.xml:
////////////////////////////////////////
- <resource-ref>
  <res-ref-name>jdbc/as400</res-ref-name> 
  <res-type>javax.sql.DataSource</res-type> 
  <res-auth>Container</res-auth> 
  </resource-ref>
////////////////////////////////////////

解决方案 »

  1.   

    也就是说,如上代码执行两次,表就会被锁。一次
    con = ds.getConnection(); 

    con.close(); 
    两次
    con = ds.getConnection(); 

    con.close(); 
      

  2.   

    加上context释放,由进行了测试,问题依旧。
      

  3.   

    多试验几种情况。
    Context ictx = new InitialContext();
    DataSource ds = (DataSource) ictx.lookup("java:comp/env/jdbc/as400");
    Class.forName("com.ibm.as400.access.AS400JDBCDriver");con = ds.getConnection();
    DatabaseMetaData dbmd = con.getMetaData();
    sql = "select * from testdb.TABA ";
    st = con.createStatement();
    rs = st.executeQuery(sql);
    rs.close();
    st.close();
    con.close();
    con = ds.getConnection();
    DatabaseMetaData dbmd = con.getMetaData();
    sql = "select * from testdb.TABA ";
    st = con.createStatement();
    rs = st.executeQuery(sql);
    rs.close();
    st.close();
    con.close();这样还锁?
      

  4.   

    看看有没有抛Exception,将close放在finally块中