数据库连接超时的异常,select超时的异常

LG4311 2018-11-01 10:39:49
数据库连接超时的异常,select超时的异常,这两个是我要返回的异常,如果try{}catch{}的话,会不会导致运行直接结束,主要是将这两个异常返回,然后插入表中,我这边有很多数据源,账号密码是自动匹配的,所以不能让异常导致运行中断,求大神帮帮忙,急救,,
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
ResultSet rs = null;

try {
connection = dataSource.getConnection(mysqlConfig.getUserName(), mysqlConfig.getPasswd());
String sqlTable = "show tables";
statement = connection.prepareStatement(sqlTable);
resultSet = statement.executeQuery();

while (resultSet.next()) {
String tableName = resultSet.getString(1);
String sqlData = "select * from `" + tableName + "` limit 1";
statement = connection.prepareStatement(sqlData);
rs = statement.executeQuery();
rs.previous();
while (rs.next()) {
logger.info(tableName+"表====>数据执行通过");
}
}
return "";
} catch (SQLException e) {
logger.error("connect to database exception", e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
logger.error("close connection error", e);
}
}
//return "";
}
...全文
285 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-11-01
  • 打赏
  • 举报
回复
你问的, 其实已经不是数据库问题了, 是程序流程如何设计的问题。 多点判断,确保日志能获取到更多信息就好。
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
ResultSet rs = null;
boolean connIsOK = false;  //加上连接是否正常的标识
boolean tableNameExists = false; //判断表名是否存在 

try {
    connection = dataSource.getConnection(mysqlConfig.getUserName(), mysqlConfig.getPasswd());
    connIsOK = true; //如果上一步已打开连接,则这里标识
    String sqlTable = "show tables";
    statement = connection.prepareStatement(sqlTable);
    resultSet = statement.executeQuery();
    
    //加一段判断表是否存在的代码, 不存在不要往下执行

    while (resultSet.next()) {
        String tableName = resultSet.getString(1);
        String sqlData = "select * from `" + tableName + "` limit 1";
        statement = connection.prepareStatement(sqlData);
        rs = statement.executeQuery();
        rs.previous();
        while (rs.next()) {
            logger.info(tableName+"表====>数据执行通过");
        }
    }
    return "";
} catch (Exception e) {//改成普通的Exception , 保证都能捕捉到。或者你多加几级 Exception 也行
    logger.error("connIsOK ", connIsOK);  //输出连接标识
    logger.error("tableNameExists ", tableNameExists);  //输出表存在标识
    logger.error("connect to database exception", e);
} finally {
    try {
        if (rs != null) {
            rs.close();
        }
        if (resultSet != null) {
            resultSet.close();
        }
        if (statement != null) {
            statement.close();
        }
        if (connection != null) {
            connection.close();
        }
    } catch (SQLException e) {
        logger.error("close connection error", e);
    }
}
//return "";
LG4311 2018-11-01
  • 打赏
  • 举报
回复
try catch之后一般程序执行会终止,而我是将异常捕获或者以其他方式拿到,返回后插入表中,而我的疑惑是不知如何获取这两个异常
LG4311 2018-11-01
  • 打赏
  • 举报
回复
您好,我这个是将这两个异常获取到,并不是解决异常,请您看看代码中应该怎样来捕获
吉普赛的歌 2018-11-01
  • 打赏
  • 举报
回复
首先, 楼主是否清楚地知道:查一行记录一般不会引起超时。异常到底是什么原因引起? 其次, 如果异常是远程的网络问题, 数据源一大堆, 这些很可能是无法解决的, 没办法做到 100%, 只能说去尽量改善。 你的诉求到底是什么?
二月十六 2018-11-01
  • 打赏
  • 举报
回复
连接超时检查一下网络是否能ping通服务器,检查一下数据库服务是否正常,查询语句在数据库中能否正常读取
吉普赛的歌 2018-11-01
  • 打赏
  • 举报
回复
http://alantong08.iteye.com/blog/1646908 看这个对你有没有用吧。 我很少搞 java 了, .net 对于这种超时设置是非常简单的。 你也可以设置一个变量, 记录开始时间, 如果发生异常, 日志里可以反应出执行了多少秒。
LG4311 2018-11-01
  • 打赏
  • 举报
回复
如果说将数据库连接超时的异常和select超时的异常 以json的形式返回呢?因为我确实是需要将这两个异常返回前台或将所有的异常插入表中,方便客户查询,还有就是catch中包含数据库连接超时异常,一直在百度select超时的异常如何获取
Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        ResultSet rs = null;

        boolean connIsOK = false;  //加上连接是否正常的标识


        try {
            connection = dataSource.getConnection(mysqlConfig.getUserName(), mysqlConfig.getPasswd());
            connIsOK = true; //如果上一步已打开连接,则这里标识
            String sqlTable = "show tables";
            statement = connection.prepareStatement(sqlTable);
            resultSet = statement.executeQuery();

            while (resultSet.next()) {
                String tableName = resultSet.getString(1);
                String sqlData = "select * from `" + tableName + "` limit 1";
                statement = connection.prepareStatement(sqlData);
                rs = statement.executeQuery();
                rs.previous();
                while (rs.next()) {
                    logger.info(tableName+"表====>数据执行通过");
                }
            }
            return "";
        } catch (Exception e) {//改成普通的Exception , 保证都能捕捉到
            logger.error("connIsOK ", connIsOK);  //输出连接标识
            logger.error("connect to database exception", e);
            return mysqlConfig.getConnection()+"   connect to database exception";
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error("close connection error", e);
            }
        }
        //return "";
    }
吉普赛的歌 2018-11-01
  • 打赏
  • 举报
回复
引用 6 楼 qq_41972011 的回复:
为何要判断表的存在呢?,不是特别明白,如果返回异常信息,要在catch中return吗,如果在catch中return的话会直接结束此执行程序吗,既然要查询select超时异常,需要在第一个while内加入if判断?
1. 为何要判断表的存在呢? 哦, 不需要, 我没仔细看, 你已经是 show tables 在查表了。 2. 如果返回异常信息,要在catch中return吗? 不一定, 最后返回也可以, 只要你的逻辑不错就行。 3. 如果在catch中return的话会直接结束此执行程序吗? 不会, 至少会执行 finally 中的内容才会结束 4. 既然要查询select超时异常,需要在第一个while内加入if判断? 超时判断不了吧, 超时直接就异常了。
LG4311 2018-11-01
  • 打赏
  • 举报
回复
为何要判断表的存在呢?,不是特别明白,如果返回异常信息,要在catch中return吗,如果在catch中return的话会直接结束此执行程序吗,既然要查询select超时异常,需要在第一个while内加入if判断?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧