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

Oracleデータベースへの自動接続の繰り返しを防ぐにはどうすればよいですか?

    根本的な問題は、解放されていないデータベース接続であることになりました。接続が開かれると、接続プールからチェックアウトされます。接続が閉じられない場合、プールは接続がまだ使用されていると見なします。これにより、プール管理ロジックは、元の接続文字列を使用してデータベースで定期的に再認証されます。パスワードが変更されると、すぐにログイン試行の失敗とアカウントのロックにつながります。

    // Problem logic; connection is never closed/returned to the connection pool.
    public static void ConnPoolTest1()
    {
        OracleConnection conn = new OracleConnection(connectionStringWithPooling);
        conn.Open();
    
        //...Do some work
    
        // Sit on this line for 5-10 minutes and examine Oracle's dba_audit_trail.
        Console.ReadKey(); // Since connection was never released back to the connection pool, the
                           // data provider's pool management will regularly re-authenticate with DB.
                           // If user's password changes before this process dies (releasing the
                           // connection pools), you start accumulating failed password attempts.
    }
    

    この問題の適切な修正は、接続が終了したときに接続が常にプールに返されるようにすることです!

    // Best practice: ALWAYS CLOSE YOUR CONNECTIONS WHEN YOU ARE DONE!
    public static void ConnPoolTest2()
    {
        OracleConnection conn = new OracleConnection(connectionStringWithPooling);
        conn.Open();
    
        //...Do some work
    
        conn.Close();
    
        // Sit on this line for 5-10 minutes and examine Oracle's dba_audit_trail.
        Console.ReadKey(); // No problem here! No recurring authentication attempts because the
                           // connection has been returned to the pool.
    }
    

    注:他の回答では、パスワードが変更されたときに、プールをオフにして古い接続プールをクリアすることを提案しました。これらの提案は、リリースされていないリソースを検索する際の一時的なパッチとして機能し、問題を特定するのに大いに役立ちました。



    1. ドロップダウン選択から更新するチャート

    2. スタースキーマとスノーフレークスキーマ

    3. android.database.sqlite.SQLiteCantOpenDatabaseException:不明なエラー(コード14):データベースを開くことができませんでした

    4. 作成時および更新時のMySQLCURRENT_TIMESTAMP