从Hibernate sessionFactory.getCurrentSession()获取prepareStatement的连接时是否需要显式关闭连接

时间:2020-06-03 14:34:32

标签: java spring hibernate jdbc sessionfactory

我想在Spring Boot应用程序中使用preparestatement插入一些记录。因此,我已经使用hibernate建立了数据库连接(HibernateConfig-仅用于数据库连接)。由于我要使用PreparedStatement,因此我从Hibernate ConnectionSessionFactory获得了Session

我知道,使用getCurrentSession时,将进行诸如session.beginTransaction()和session.save()之类的休眠操作的事务管理本身。

使用sessionFactory.getCurrentSession()时,我是否需要关闭连接和其他东西,在finally块中明确关闭?请检查以下代码中的finally块:

在DAOImpl文件中

@Repository
@Transactional
public class TestDAOImpl implements TestDAO {

@Autowired
private SessionFactory sessionFactory;

public Connection getConnection(){
         Session session = sessionFactory.getCurrentSession();
         Connection conn = session.doReturningWork(new ReturningWork<Connection>() {
                @Override
                public Connection execute(Connection conn) throws SQLException {
                    return conn;
                }
         });
        return conn;
}

public void insertRecords() {
     Connection conn= getConnection();
     PreparedStatement ps = null;
     try {
         String inserQuery ="INSERT IN TO TEST VALUES(?,?,?)" //some insert statement
         conn.setAutoCommit(false);
         ps = conn.prepareStatement(inserQuery);
         //set values ps.setString() and ps.addBatch(); -some code here

         int[] insertCounts = ps.executeBatch();
         conn.commit();
     } catch(BatchUpdateException e){

     } catch(SQLException e){

     } finally {
           if(ps!=null)ps.close();
           if(conn!=null) conn.close();
           if(sessionFactory!=null) sessionFactory.close();
 }
}

请注意,我在同一DAOImpl类中使用了3个以上方法,并为每个方法Connection conn= getConnection();创建了连接,并在finally块中关闭了。

也请让我知道最佳实践或从SessionFactory获得连接的任何其他替代方法。

2 个答案:

答案 0 :(得分:1)

是的,您必须关闭连接以防止内存泄漏。 最好的方法是try-with-resources语句,该语句会自动关闭您在其中打开的可关闭资源。

try(Connection con = getConnection; Statement stmt = con.prepareStatement(insertSql)) {
...
} catch(Exception e) {
...}

您也不需要这种方法来阻止finally。

编辑:仅供参考,如果您不关闭连接,它将保持打开状态,直到您关闭该应用程序,并且随后的每个调用都会打开一个新的连接。我想您可以想象一下,一次您的数据库最多只允许100个打开的连接。

答案 1 :(得分:0)

按照@MarkRotteveel的建议,我删除了休眠配置文件并添加了以下代码

package-lock.json

在DAOImpl类中,

npm install

请检查并告知我是否需要此处进行任何修改。

相关问题