问题描述

在使用Oracle数据库时,在驱动及连接正常的情况下,报错如下:
java.sql.SQLException: 关闭的连接
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.driver.OracleConnection.privatePrepareStatement(OracleConnection.java:895)
at oracle.jdbc.driver.OracleConnection.prepareStatement(OracleConnection.java:802)

解决方案:

修改前:
将加载驱动以及连接数据库的getConnection()函数,另外编写在JDBCUtil的类中,当需要使用数据库时,在相应的函数中调用JDBCUtil.getConnection()进行数据库的连接。
修改办法:
将getConnection()中的连接操作,直接编写到相应的使用数据库的函数中,不再单独编写,如下面的程序:

public Book getBook(int ID) {
		Book result=null;
		try {
			//加载数据库驱动
			try{
				Class.forName("oracle.jdbc.driver.OracleDriver");
				System.out.println("加载数据库驱动成功!");
			}
			catch(ClassNotFoundException e){
				System.out.println("加载数据库驱动失败!");
				e.printStackTrace();	
			}
			//连接数据库
			if(con==null){
				try{
					con=DriverManager.getConnection(url,"user","000");
					System.out.println("创建数据库连接成功!");
				}
				catch(SQLException e){
					System.out.println("创建数据库连接失败!");
					e.printStackTrace();
				}
			}
			//查询相应等数据库的具体操作
			String sql="select * from BOOK2 where ID=?";
			PreparedStatement pstmt=con.prepareStatement(sql);
			pstmt.setInt(1, ID);
			ResultSet rs=pstmt.executeQuery();
			while(rs.next()) {
				result=new Book();
				result.setID(ID);
				String name=rs.getString(2);
				float price=rs.getFloat(3);
				result.setName(name);
				result.setPrice(price);
			}
			//关闭rs、pstmt以及数据库连接
			if(rs!=null) {
				rs.close();
			}
			rs=null;
			if(pstmt!=null) {
				pstmt.close();
			}
			pstmt=null;
			if(con!=null) {
				con.close();
				con=null;
			}
		}
		catch(SQLException e) {
			System.out.println("Error!");
			e.printStackTrace();
		}
		return result;
	}

问题原因

我也不太清楚啊,就是试着改了一下就可以了,希望会遇到大佬进行解答吧!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐