Java 使用资源尝试如何使用自定义逻辑关闭连接
在下面的示例中,我们使用try with resource关闭连接并准备语句。它将关闭连接并准备好声明 而且我们正在使用2个try块,如下所述Java 使用资源尝试如何使用自定义逻辑关闭连接,java,Java,在下面的示例中,我们使用try with resource关闭连接并准备语句。它将关闭连接并准备好声明 而且我们正在使用2个try块,如下所述 用于关闭连接和准备好的语句 结束结果集 将来,如果我们有任何与文件相关的操作,那么我们将需要使用资源块编写另一个try try (Connection con = ds.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) { try (ResultSet
try (Connection con = ds.getConnection();
PreparedStatement ps = con.prepareStatement(sql);) {
try (ResultSet rs = ps.executeQuery();) {
while (rs.next()) {
list.add(rs.getInt("id"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
但若我们并没有使用try with resource,那个么我们可以在单个try-catch块中重写上面的登录,如下所示
try {
Connection con = ds.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
list.add(rs.getInt("id"));
}
} catch (Exception e) {
// Closing RS
// Closing PS
// Closing Connection or Customized closing connection logic
}
问题:即使在关闭连接时有任何自定义操作,是否可以使用try-with-resource块
另外,请建议在这种情况下哪种解决方案更好。几周前,我遇到了类似的问题。您不需要对资源进行多次尝试,您只能进行一次查看 但是在您的第二个代码示例中,您不想关闭连接和catch块中的所有内容。最后必须使用
简而言之,对于“普通”的东西,您只能使用一次try-with-resources,然后在后者内部创建另一个try-catch(或者使用对自定义方法的调用)来处理和关闭您的自定义操作
try(Connection conn=datasource.getConnection();
语句Statement=conn.createStatement();
ResultSet rs=statement.executeQuery(请求);){
while(rs.next())
{
//做你的事。
}
尝试
{
//做你的事。
}捕获(无论是什么){
//处理。
}最后{
//关闭你的定制物品。
}
}catch(SQLException-ex){
//扔东西。
}
希望这能有所帮助。几周前我也遇到过类似的问题。您不需要对资源进行多次尝试,您只能进行一次查看 但是在您的第二个代码示例中,您不想关闭连接和catch块中的所有内容。最后必须使用
简而言之,对于“普通”的东西,您只能使用一次try-with-resources,然后在后者内部创建另一个try-catch(或者使用对自定义方法的调用)来处理和关闭您的自定义操作
try(Connection conn=datasource.getConnection();
语句Statement=conn.createStatement();
ResultSet rs=statement.executeQuery(请求);){
while(rs.next())
{
//做你的事。
}
尝试
{
//做你的事。
}捕获(无论是什么){
//处理。
}最后{
//关闭你的定制物品。
}
}catch(SQLException-ex){
//扔东西。
}
希望这有帮助。使用资源进行尝试是一个更好的解决方案,因为它只在“尝试”块中使用您的连接。但是:
catch (SQLException e)
与以下情况不同:
catch (Exception e)
(异常e)
将捕获SQLException
,如果您说要执行一些与文件相关的操作,可能还会捕获FileNotFoundException
或IOException
,因此此捕获不是很有启发性。在我看来,您应该首先阅读单一责任原则,然后您会发现处理问题的最佳选择是创建两个try块,分别处理如下操作:
public static List<Integer> getAllProducts() {
List<Integer> productIds = new ArrayList<>();
try (Connection con = ds.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) {
try (ResultSet rs = ps.executeQuery();) {
while (rs.next()) {
productIds.add(rs.getInt("id"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return productIds;
}
public static void writeSomething(String fileName) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
writer.write("StackOverflow");
} catch (IOException e) {
e.printStackTrace();
}
}
公共静态列表getAllProducts(){
List productIds=new ArrayList();
try(Connection con=ds.getConnection();PreparedStatement ps=con.preparest陈述(sql);){
try(ResultSet rs=ps.executeQuery();){
while(rs.next()){
productIds.add(rs.getInt(“id”));
}
}
}捕获(SQLE异常){
e、 printStackTrace();
}
返回productid;
}
公共静态void writeMething(字符串文件名){
try(BufferedWriter=new BufferedWriter(new FileWriter(fileName))){
write.write(“堆栈溢出”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
Try with resources是一个更好的解决方案,因为它只在“Try”块中使用您的连接。但是:
catch (SQLException e)
与以下情况不同:
catch (Exception e)
(异常e)
将捕获SQLException
,如果您说要执行一些与文件相关的操作,可能还会捕获FileNotFoundException
或IOException
,因此此捕获不是很有启发性。在我看来,您应该首先阅读单一责任原则,然后您会发现处理问题的最佳选择是创建两个try块,分别处理如下操作:
public static List<Integer> getAllProducts() {
List<Integer> productIds = new ArrayList<>();
try (Connection con = ds.getConnection(); PreparedStatement ps = con.prepareStatement(sql);) {
try (ResultSet rs = ps.executeQuery();) {
while (rs.next()) {
productIds.add(rs.getInt("id"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return productIds;
}
public static void writeSomething(String fileName) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
writer.write("StackOverflow");
} catch (IOException e) {
e.printStackTrace();
}
}
公共静态列表getAllProducts(){
List productIds=new ArrayList();
try(Connection con=ds.getConnection();PreparedStatement ps=con.preparest陈述(sql);){
try(ResultSet rs=ps.executeQuery();){
while(rs.next()){
productIds.add(rs.getInt(“id”));
}
}
}捕获(SQLE异常){
e、 printStackTrace();
}
返回productid;
}
公共静态void writeMething(字符串文件名){
try(BufferedWriter=new BufferedWriter(new FileWriter(fileName))){
write.write(“堆栈溢出”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
为什么要添加另一个资源尝试?为什么不将其添加到现有的try with resources中呢?我认为您无法(轻松或根本无法)干预自动关闭
自动关闭的。。。如果您想确保在中关闭所有内容,请在没有资源的情况下尝试
,然后在最后
块中关闭它,并在之前检查null
。请描述“自定义关闭连接逻辑”。你到底想做什么?似乎你想做一些非常奇怪(和危险?)的事情。您可以使用自定义类包装给定的连接