为什么连接抛出timeoutException没有提交

时间:2014-10-11 20:16:41

标签: java mysql commit connection transactionmanager

我有一个DAO类,下面有方法。我在事务管理器中称之为。当我在没有“conn.commit()”行的情况下运行它时 - 它会抛出超时异常,但是当我用它运行它时 - 它没关系。有什么问题?据我所知,如果不修改db,则没有必要提交?

    @Override
    public List<String> getLinks(int id) throws SQLException {
        List<String> list = new ArrayList<>();
        Connection conn = factory.newConnection();
        Statement statement = null;
        ResultSet rs = null;
        try {
            String expression = "select link from users.links where id=" + id + " order by id_link desc";
            statement = conn.createStatement();
            rs = statement.executeQuery(expression);
            while (rs.next()) {
                list.add(rs.getString("link"));
            }
            // !!!!!!!!!!!!! without next line method throw TimeoutException
            conn.commit(); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            return list;
        } catch (SQLException e) {
            rollBackQuietly(conn);
            e.printStackTrace();
        } finally {
            closeQuaitly(rs);
            closeQuaitly(statement);
            closeQuaitly(conn);
        }
        return null;
    }

1 个答案:

答案 0 :(得分:0)

在抛出异常的行之后看到commit()调用是,这个问题必须在重复调用此方法之后出现(包含在您的问题中的有用信息)。这让我相信你的Connection工厂正在重新使用Connections,而且它正在发布&#34;陈旧的&#34;连接(已连接太长且不再可用的连接)。如果这一切都是真的,那么你需要让你的工厂更好地管理Connections。如果它是一个合理构建的连接池,它可能有一些功能,如&#34;空闲时测试&#34;或者&#34;测试get&#34;你需要启用它。