我想在Spring Boot应用程序中使用preparestatement插入一些记录。因此,我已经使用hibernate建立了数据库连接(HibernateConfig-仅用于数据库连接)。由于我要使用PreparedStatement,因此我从Hibernate Connection
或SessionFactory
获得了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获得连接的任何其他替代方法。
答案 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
请检查并告知我是否需要此处进行任何修改。