首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从prepareStatement的Hibernate sessionFactory.getCurrentSession()获取连接时是否需要显式关闭连接

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

Stack Overflow用户
提问于 2020-06-03 22:34:32
回答 2查看 185关注 0票数 0

我想在Spring Boot应用程序中使用preparedstatement插入一些记录。因此,我已经使用hibernate建立了数据库连接(对于数据库连接,仅限HibernateConfig)。由于我将使用preparedstatement,我从Hibernate SessionFactorySession获取了一个Connection

我知道,在使用getCurrentSession时,它会像session.beginTransaction()和session.save()一样处理hibernate操作的事务管理本身。

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

在DAOImpl文件中

代码语言:javascript
运行
复制
@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获取连接的最佳实践或任何其他替代方法。

EN

回答 2

Stack Overflow用户

发布于 2020-06-03 22:41:00

此外,最好的方法是使用try-with-resources语句,它会自动关闭您在其中打开的可关闭资源。

代码语言:javascript
运行
复制
try(Connection con = getConnection; Statement stmt = con.prepareStatement(insertSql)) {
...
} catch(Exception e) {
...}

编辑:仅供参考:如果您不关闭连接,它将保持打开状态,直到您关闭应用程序,然后每个后续调用都会打开一个新的连接。我猜你可以想象这意味着什么,当你的数据库一次只允许最多100个打开的连接时。

票数 1
EN

Stack Overflow用户

发布于 2020-06-05 21:08:06

根据@MarkRotteveel的建议,我删除了hibernate配置文件,并添加了以下代码

代码语言:javascript
运行
复制
@Configuration
public class DataSourceConfig {

    @Bean("dataSource")
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

}

代码语言:javascript
运行
复制
@Autowired
private DataSource dataSource;

try(Connection conn= dataSource.getConnection();
       PreparedStatement ps = conn.prepareStatement(inserQuery);) {
    .....
}catch(Exception e){
    ....
}

如果这里有任何需要修改的地方,请检查并告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62175503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档