sql >> データベース >  >> RDS >> Mysql

ResultSetを返す

    ResultSetを渡さないでください 公的な方法で周り。ステートメントと接続を開いたままにする必要があるため、これはリソースリークを起こしやすいです。それらを閉じると、結果セットが暗黙的に閉じられます。ただし、それらを開いたままにしておくと、それらがぶらぶらして、開いているリソースが多すぎるとDBのリソースが不足する原因になります。

    そのようにJavabeansのコレクションにマップし、代わりに返します:

    public List<Biler> list() throws SQLException {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<Biler> bilers = new ArrayList<Biler>();
    
        try {
            connection = database.getConnection();
            statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
            resultSet = statement.executeQuery();
    
            while (resultSet.next()) {
                Biler biler = new Biler();
                biler.setId(resultSet.getLong("id"));
                biler.setName(resultSet.getString("name"));
                biler.setValue(resultSet.getInt("value"));
                bilers.add(biler);
            }
        } finally {
            if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
            if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
            if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
        }
    
        return bilers;
    }
    

    または、すでにJava 7を使用している場合は、を使用してください。 try-with-resources それらのリソースを自動的に閉じるステートメント:

    public List<Biler> list() throws SQLException {
        List<Biler> bilers = new ArrayList<Biler>();
    
        try (
            Connection connection = database.getConnection();
            PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
            ResultSet resultSet = statement.executeQuery();
        ) {
            while (resultSet.next()) {
                Biler biler = new Biler();
                biler.setId(resultSet.getLong("id"));
                biler.setName(resultSet.getString("name"));
                biler.setValue(resultSet.getInt("value"));
                bilers.add(biler);
            }
        }
    
        return bilers;
    }
    

    ちなみに、Connectionを宣言するべきではありません 、Statement およびResultSet インスタンス変数として(スレッドセーフの大きな問題です!)、SQLExceptionを飲み込むこともありません。 その時点では(呼び出し元には問題が発生したという手がかりはありません)、同じtryでリソースを閉じることもありません。 (たとえば、結果セットcloseが例外をスローした場合、ステートメントと接続はまだ開いています)。これらの問題はすべて、上記のコードスニペットで修正されています。



    1. PL / SQLにハッシュ関数はありますか?

    2. RACでのASHシーケンスの競合の特定

    3. SQL Serverのチューニング–すべては測定に関するものです

    4. Oracle D2kForms6iのフォーム画面の更新/更新