我想在Spring Boot应用程序中使用preparedstatement插入一些记录。因此,我已经使用hibernate建立了数据库连接(对于数据库连接,仅限HibernateConfig)。由于我将使用preparedstatement,我从Hibernate SessionFactory
或Session
获取了一个Connection
。
我知道,在使用getCurrentSession时,它会像session.beginTransaction()和session.save()一样处理hibernate操作的事务管理本身。
在使用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获取连接的最佳实践或任何其他替代方法。
发布于 2020-06-03 22:41:00
此外,最好的方法是使用try-with-resources语句,它会自动关闭您在其中打开的可关闭资源。
try(Connection con = getConnection; Statement stmt = con.prepareStatement(insertSql)) {
...
} catch(Exception e) {
...}
编辑:仅供参考:如果您不关闭连接,它将保持打开状态,直到您关闭应用程序,然后每个后续调用都会打开一个新的连接。我猜你可以想象这意味着什么,当你的数据库一次只允许最多100个打开的连接时。
发布于 2020-06-05 21:08:06
根据@MarkRotteveel的建议,我删除了hibernate配置文件,并添加了以下代码
@Configuration
public class DataSourceConfig {
@Bean("dataSource")
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
@Autowired
private DataSource dataSource;
try(Connection conn= dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(inserQuery);) {
.....
}catch(Exception e){
....
}
如果这里有任何需要修改的地方,请检查并告诉我。
https://stackoverflow.com/questions/62175503
复制相似问题