blue2048 2009-07-28 16:43
浏览 392
已采纳

jdbc直连,连接无法关闭!

package com.softtone.excution;

import java.sql.*;
import java.util.List;

public class Odb
{
String driverClassName = null;
String URL = null;
String username = null;
String password = null;
Connection mycon = null;
ResultSet rs=null;
Statement statement=null ;

/**
* @param driverClassName
* @param url
* @param username
* @param password
*/

public Odb(){
    driverClassName = "com.ibm.db2.jcc.DB2Driver";
    URL = "jdbc:db2://202.112.107.114:3700/wapsite";
    username = "db2inst";
    password = "db2inst";
}
public Odb(String dbip,String dbport,String dbname,String username,String password)
{
    this.driverClassName = "COM.ibm.db2.jcc.DB2Driver";
    this.URL = "jdbc:db2://"+dbip+":"+dbport+"/"+dbname+"";
    this.username = username; 
    this.password =  password; 

}

/**
 * 返回一个数据库的连接。
 */
public Connection getConnection() {
    try{
        Driver driver=null;
        driver = (Driver)Class.forName(driverClassName).newInstance();
        DriverManager.registerDriver(driver);
        mycon = DriverManager.getConnection(URL,username,password);// 数据源连接信息

        mycon.setAutoCommit(false);
        System.out.println("CONN OPENED");
        return mycon;
    } 
    catch (Exception e){
        close();
        e.printStackTrace();
        throw new RuntimeException(e);
    }
} 
public Connection getAConnection(){
    try{
        if (mycon==null){
            return getConnection();
        }else{
            return mycon;
        }
    }catch (Exception e) {
        // TODO 自动生成 catch 块
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

/**
 * 查询数据库,返回一个ResultSet结果集。
 */
public ResultSet query(String sql){
    try{
        getAConnection();
        statement = mycon.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs=statement.executeQuery(sql);
    }catch(SQLException ex){
        System.err.println("query():"+ex.getMessage());
        System.err.println("SQL:"+sql);
        throw new RuntimeException(ex);
    }catch (Exception e) {
        // TODO 自动生成 catch 块
        e.printStackTrace();
        throw new RuntimeException(e);
    }
    return rs;
}



/**
 * 执行单条sql语句。
 */
public boolean excute(String sql)
{
    try
    {
        getAConnection();
        statement = mycon.createStatement();
        statement.execute(sql);
        mycon.commit();//提交

        return true;
    }
    catch(SQLException ex) 
    {
        System.err.println("query():"+ex.getMessage());

        return false;
    } catch (Exception e) {
        // TODO 自动生成 catch 块
        e.printStackTrace();

        return false;
    }

}

/**
 * 批量执行sql语句。
 */
public boolean excute(List<String> sql) throws SQLException
{
    try
    {
        try 
        {
            getAConnection();
        } 
        catch (Exception e) 
        {
            // TODO 自动生成 catch 块
            e.printStackTrace();

// close();
}
mycon.setAutoCommit(false);
statement = mycon.createStatement();
//System.out.println("进到这里了吗??");
for(int i=0;i<sql.size();i++)
{
statement.addBatch(sql.get(i));

System.out.println("我所获得的sql语句是:" + sql.get(i));

        }
        statement.executeBatch();   

        //System.out.println("几条SQL语句更新了呢?" + updateRows);

            System.out.println("我进到这里了吗?");
            mycon.commit();//提交
            return true;

    }
    catch(SQLException ex)
    {
        try {
            mycon.rollback();

// close();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
System.err.println("query():"+ex.getMessage());
throw ex;
}

}

//关闭数据库连接
public void close()
{

    try{
        if(rs!=null){
            rs.close();
        }
    }catch(Exception es){
        es.printStackTrace();
    }
    try{
        if(statement!=null){
            statement.close();
        }
    }catch(Exception es){
        es.printStackTrace();
    }
    try{
        if(mycon!=null){
            mycon.close();
            System.out.println("CONN CLOSEED");
        }
    }catch(Exception es){
        es.printStackTrace();
    }   
    statement = null;
    rs = null;
    mycon = null;

}


public static void main(String[] arg) throws Exception{
    Odb odb=new Odb();
    //odb.getAConnection();
    int i=0;
    String sql="";
    ResultSet rs=null;
    sql = "select * from bus_code";
    rs = odb.query(sql);
    while(rs.next())
    {
    System.out.println(++i);
    }
    //System.out.println(rs.getString(2));
    rs.close();
    odb.close();

}

}


com.ibm.db2.jcc.b.SqlException: [jcc][t4][10251][10308][3.53.70] 正在连接上执行事务时,请求了 java.sql.Connection.close()。
事务仍然保持活动状态,不能关闭连接。 ERRORCODE=-4471, SQLSTATE=null
at com.ibm.db2.jcc.b.bd.a(bd.java:660)
at com.ibm.db2.jcc.b.bd.a(bd.java:60)
at com.ibm.db2.jcc.b.bd.a(bd.java:120)
at com.ibm.db2.jcc.b.jb.t(jb.java:1105)
at com.ibm.db2.jcc.b.jb.w(jb.java:1128)
at com.ibm.db2.jcc.b.jb.u(jb.java:1114)
at com.ibm.db2.jcc.b.jb.close(jb.java:1098)
at com.softtone.excution.Odb.close(Odb.java:192)
at com.softtone.excution.Odb.main(Odb.java:219)


查询没有任何问题,就是无法关闭
数据库:DB2 v9.5
jcc驱动

  • 写回答

1条回答 默认 最新

  • hunterli0408 2009-07-28 17:58
    关注

    [quote]
    mycon = DriverManager.getConnection(URL,username,password);// 数据源连接信息
    mycon.setAutoCommit(false);
    System.out.println("CONN OPENED");

    [/quote]
    可能是因为这段代码的原因。不要上来就把AutoCommit设为false,而是要在具体的操作里面设置,查询操作的话AutoCommit默认为true就可以。lz的query方法里面取到的connection的AutoCommit为false,但查询结束时并没有commit,所以事务没有结束。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料