是否需要关闭数据库连接?

时间:2016-01-10 00:47:36

标签: java sql sql-server database jdbc

我正在研究java和mssql中的学校项目,我在数据库连接方面遇到了一些麻烦。

在这种情况下是否需要关闭数据库连接?

我想构建一个由Person对象组成的Animal对象。

这是来自DBLayer / DBAnimal的代码:

首先我们有一个方法,我连接到数据库并获取结果集。

public Animal findAnimal(int id) 
    {
        con = DBConnection.getInstance().getDBcon();
        PreparedStatement preStmnt = null;
        String query = "select * from animal where id = ?";
        Animal animalObj = null;
        ResultSet results;
        try 
        {
            preStmnt = con.prepareStatement(query);
            preStmnt.setInt(1, id);
            results = preStmnt.executeQuery();
            if (results.next()) 
            {
                animalObj = buildAnimal(results);
            }
        } catch (SQLException SQLe) {
            System.out.println("SQL Exception i findAnimal: " + SQLe);
        } catch (Exception e) {
            System.out.println("Exception i findAnimal() " + e.getMessage());

        }

        DBConnection.closeConnection(); 
        return animalObj;
    }

然后我构建Animal对象并调用FindPersonOnId方法:

public Animal buildAnimal(ResultSet results) throws SQLException 
    {

        Animal animalObj = new Animal();

        Person personObj = new Person();

        try 
        {

            animalObj.setId(results.getInt("id"));
            animalObj.setName(results.getString("name"));           
            animalObj.setRace(results.getInt("raceid"));
            animalObj.setSpecie(findSpecieId(results.getInt("raceid")));
            animalObj.setSex(results.getString("sex").charAt(0));
            animalObj.setBorn(results.getDate("born"));
            animalObj.setAlive(results.getBoolean("alive"));
            animalObj.setPerson(dbPerson.findPersonOnId(results.getInt("personId")));
        }

        catch (SQLException e) 
        {
            System.out.println("Exception i buildAnimal" + e.getMessage());
        }

        return animalObj;
    }

这是来自DBLayer / DBPerson:

public Person findPersonOnId(int id) 
    {
        con = DBConnection.getInstance().getDBcon();
        PreparedStatement preStmnt = null;
        String query = "SELECT * FROM " + TABLE_NAME + " WHERE id = ?";
        Person personObj = null;
        ResultSet results;
        try 
        {
            preStmnt = con.prepareStatement(query);
            preStmnt.setInt(1, id);
            results = preStmnt.executeQuery();
            if (results.next()) 
            {
                personObj = buildPerson(results);
            }
        } 
        catch(SQLException SQLe) 
        {
            System.out.println("SQLException i findPersonOnId(id): " + SQLe);
        } 
        catch (Exception e)
        {
            System.out.println("Fejl i findPersonOnId(id): " + e.getMessage());
        }

        DBConnection.getInstance().closeConnection();
        return personObj;
    }

你可以看到我两次都在使用closeConnection,这会导致一些问题,因为它非常慢。我正在游荡,在这种情况下根本需要关闭连接。

如果不是,那将是什么情况?

1 个答案:

答案 0 :(得分:2)

是的

每次建立连接时,你必须确保它最终被关闭,否则你将会泄漏资源,而且会有太多的开放连接,你的应用程序将会中断。

话虽如此,有些工具和库可以让这更容易,Spring JdbcTemplate就是其中之一。

如果没有查看 DBConnection 类,它似乎正在尝试执行Datasource的操作,请考虑使用正确的datasource