我正在尝试使用重试逻辑来获取JDBC连接,以防出现SQL异常,例如:
int counter = 0;
Connection conn = null;
while (null == conn) {
try {
conn = GetConnectionObject;
} catch (SQLException e) {
if (++counter > MAX_RETRY) {
//Log ERROR
break;
}
} finally {
if (null != conn) {
try {
DbUtils.close(conn);
} catch (SQLException e) {
logger.error("Exception while closing the connection object");
}
}
}
}
我目前无法测试,因此需要一些帮助。
如果我遇到异常,然后重试后可以登录,这将很好地工作。但是如果我们没有得到异常,它将到达finally块并关闭连接。最后试着抓住里面的while循环。
所以如果我关闭我的连接,流动如果达到
while(null==连接)
我的连接对象在关闭后会变为null吗?
或者是否有其他方法来实现重试部分?
这是针对您的问题测试的方法。此方法尝试连接3次,当它获得数据库连接时,它将打印成功消息,并将运行查询并显示结果,否则它将打印错误消息。此外,如果连接成功,它将在最终块中执行查询后关闭连接。
public void retryDBConnection(){
int counter = 0;
Connection con = null;
while(counter < 3 && con == null){
try{
String str = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Class.forName(str).newInstance();
con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;Database=TestDB;", "sa", "sqldb");
System.out.println("DB Connection Successful!");
PreparedStatement prep = con.prepareStatement("select ID, User_Name from tblUser where ID = 9");
ResultSet rs = prep.executeQuery();
if(rs.next()){
System.out.println("User ID = " + rs.getString(1));
//name = rs.getString(2);
}
}
catch(SQLException e){
// System.out.println(e.getSQLState());
if(e.getErrorCode() == 0 || e.getErrorCode() == 4060)
counter++;
System.out.println("Attempt: " + counter +", Could not establish DB Connection!");
System.out.println("Error Code: " + e.getErrorCode());
}
catch(Exception e){
e.printStackTrace();
}finally{
if(con != null){
try {
con.close();
System.out.println("Connection closed...");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
这是方法的输出。
尝试:1,无法建立DB连接!错误代码:0尝试:2,无法建立DB连接!错误代码:4060 DB连接成功!用户ID=9连接已关闭。。。
不,它在关闭后不会变为空。使用连接。isClosed()而不是while(null==conn)。此外,您应该得到//执行一些任务 从这段代码中删除,因为它的目标是获得JDBC连接。
问题内容: 我有一个方法(如下),该方法可以下拉并以String形式返回网页的来源。一切正常且繁琐,但是当连接超时时,程序将引发异常并退出。有没有更好的方法可以执行此操作以允许它在超时时重试,或者有没有办法在此方法内执行此操作? 问题答案: 这是代码的重构,应重试下载时间。虽然尚未进行测试,但是它应该向正确的方向发展。
问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager
问题内容: 我将SQL Server 2014更新为最新的修订包( 12.0.5207 )。在环境中,唯一启用的协议是TLS1.2(已为此目的设置了注册表项)。我可以使用Management Studio在本地和远程使用SA帐户连接到SQL Server。 但是,当我尝试使用Java代码和JDBC驱动程序 sqljdbc42.jar 建立与SQL Server的连接时,会引发以下异常: 驱动程序无
我正试图通过JSTL连接JDBC。我的Localhost ie:Xampp连接也完成了,但我还是遇到了无法解决的错误。请帮忙!我使用的是Netbeans 8.0.2。下面是代码。[1]: https://i.stack.imgur.com/R4AUp.png[这是我得到的错误][1] 我还添加了“mysql-connector-java-5.1.23-bin”。jar'是Web服务器的lib目录。
问题内容: 我有一个Runnable,它从如下所示的连接池中获得连接,并有60秒的时间对连接进行处理: 当线程在60s之后死掉时,我假定连接已返回到池中,并且当创建新线程时,可以重新使用该连接。但是当我列出我的网络连接时,随着创建更多线程,该列表会不断增长。如上创建的连接是否正确返回到池中,如果可以,我如何强制重新使用连接? 问题答案: 您实际上并没有使用连接池。A 不能直接使用。其目的是作为一个
问题内容: 有人可以提供有关如何建立JDBC连接池的示例或链接吗? 从搜索谷歌,我看到这样做的许多不同方式,这相当令人困惑。 最终,我需要代码来返回一个对象,但是我在入门时遇到了麻烦。欢迎任何建议。 更新: 没有或没有池连接实现?为什么不最好使用这些? 问题答案: 如果你需要一个独立的连接池,那么我首选的是C3P0而不是DBCP(我在上一个答案中已经提到),在重负载下我对DBCP的问题太多了。使用