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

MySqlの接続が多すぎます

    あなたのアプローチでは、前に例外がスローされた場合、接続が閉じられることはありません。 conn.close() と呼ばれます。 tryでそれ(およびステートメントと結果セット)を取得する必要があります ブロックしてfinallyで閉じます ブロック。 finallyのコード 常に 例外がスローされたかどうかに関係なく実行されます。これにより、確実に 高価なリソースが閉鎖されること。

    これが書き直しです:

    public int getSiteIdFromName(String name, String company) throws DataAccessException, java.sql.SQLException {
        Connection conn = null;
        Statement smt = null;
        ResultSet rs = null;
        int id = 0;
        try {
            conn = this.getSession().connection();
            smt = conn.createStatement();
            String query = "SELECT id FROM site WHERE name='" + name + "' and company_id='" + company + "'";
            rs = smt.executeQuery(query);
            rs.next();
            id = rs.getInt("id");
        } finally {
            if (rs != null) try { rs.close(); } catch (SQLException logOrIgnore) {}
            if (smt != null) try { smt.close(); } catch (SQLException logOrIgnore) {}
            if (conn != null) try { conn.close(); } catch (SQLException logOrIgnore) {}
        }
        return id;
    }
    

    とはいえ、このコードはSQLインジェクション に敏感です。 攻撃PreparedStatementを使用する Statementの代わりに 。

    関連項目



    1. ファイルまたはアセンブリを読み込めませんでした'MySql.Data、Version =6.3.6.0

    2. Bashで変数を宣言しますか?

    3. mysqlのようなパフォーマンスの向上

    4. チーム内でOracleのストアドプロシージャを操作するためのツール?