我将连接提供程序类作为bleow来返回连接。
public class ConnectionProvider {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection ConnectDB() throws ClassNotFoundException, SQLException {
try (Connection connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/jspservlet_test","root", "root");
) {
return connection;
}
}
}
这是调用连接提供程序的主要方法。
public void Test() {
try {
Connection con = ConnectionProvider.ConnectDB();
PreparedStatement ps = con.prepareStatement("");
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
但是“com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许任何操作。”错误总是显示在下面的代码行。
PreparedStatement ps = con.prepareStatement("");
因为,根据Oracle文档,如果使用资源java 7功能尝试,资源在try块后自动关闭,即使它发生了错误。所以,即使我已经关闭了连接,它已经关闭了。
让我知道,我的使用逻辑错了? 如何在try with resource中返回此连接? 我尝试了很多时间谷歌搜索解决方案,但没有得到方便的答案。
请告诉我你的建议和反馈。
答案 0 :(得分:2)
在您try-with-resources
连接之后return
使用return
,connection
(d)关闭(d)。您无法从try内部返回连接资源。
将try-with-resources
(在connection
内)传递给采用Connection
的方法。您也可以使用ConnectionPool,并在需要时获取TreeItem
(创建和执行查询)。
答案 1 :(得分:1)
请告诉我,我的使用逻辑是错误的?
在此上下文中使用'try-with-resources'逻辑是错误的,因为ConnectDB()
的意图是返回一个连接实例,调用者实际可以使用它来发送SQL语句,但是相反,由于使用了“ try-with-resources ”Java构造,连接实例在被调用者使用之前会自动关闭。
答案 2 :(得分:1)
试用资源和JDBC的快速操作方法
您的ConnectionProvider的ConnectDB 已经声明它正在抛出SQLException - 所以不需要在这里捕获它:(您应该考虑用连接池替换此代码)
public class ConnectionProvider {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection ConnectDB() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/jspservlet_test","root", "root");
}
}
而是在测试类中使用try-with-resource来清理代码并专注于SQL代码的错误 可能有:
public void Test() {
try (Connection con = ConnectionProvider.ConnectDB();
PreparedStatement ps = con.prepareStatement("SELECT 1")) {
//Prepare your Statement
ps.setInt(1, 1);
//And another try-with-resource for the result - note the closing brace
try(ResultSet rs = ps.executeQuery()) {
while(rs.next()) {
//Handle your Result
System.out.println(rs.getString(1));
}
} // This closes try-with-resource. Exception will be rethron to be caught in outer catch!
} catch (SQLException e) {
//SQL is Broken - but only ONE catch to catch them all
e.printStackTrace();
}
}
这样你获得