0

私はGroovyを初めて使用し、groovy.sql.sqlをインポートとして使用してsql.executeおよびsql.callステートメントを介してSQLを実行する「public static void main」を持つ単純なクラスを持っています。また、Oracle データベース内の既存のアプリケーション内のセキュリティ設定をチェックするサービスをインポートしています。また、SQL ステートメントも実行します。私の質問は、人々は通常どのように SQL 接続を達成するのですか? クラスごとに接続を開きますか、つまり、各クラス内で個別の SQL 接続を開きますか? または、SQL 接続情報をそのクラスに渡して、同じ接続を何らかの方法で使用できますか? 現在、2 つの別々の接続で動作していますが、それがこれを達成するための良い方法であるかどうかはわかりません。

上記が完全に意味をなさない場合 (私は初心者なので)、ここに私のコードのサンプルを示します。私のメインクラスでは、次のように SQL を開いて呼び出します。

//DB connection
def conn = new DbConnectService()           
def sql = Sql.newInstance(conn.url, conn.username, conn.password, conn.driver)

次に、次のようなセキュリティ チェック クラスを呼び出して、セキュリティ設定を確認します。

// Security check
def sec = new CheckSecurityService()
sec.SecurityCheck(ProgramName)

セキュリティ チェックは、上記とまったく同じ DB 接続を開いた後、次のような SQL 呼び出しを行います。

try 
{
        sql.call '{call G$_SECURITY.G$_VERIFY_PASSWORD1_PRD(?, ?, ?, ?)}', [$p_object, p_version, sql.VARCHAR, Sql.VARCHAR], { p_pass, p_rol ->
            p_password = p_pass
            p_role = p_rol
        } 

それが成功したら、メイン クラスに戻り、次のような SQL ステートメントをさらに実行します。

sql.execute("insert into test (key1, text) values (${foo}, ${text1})")

人々が通常これをどのように行うかについての情報は大歓迎です! ありがとう!

4

1 に答える 1

0

あなたがそれをすべてmainスレッドで行っていると述べたように、それはシングルスレッドアプリケーションだと思います。その後、接続を再利用しても問題ないはずです。理想的には、マルチスレッド アプリケーションでは、コード内で Connection を直接開いたり閉じたりするのではなく、DataSource と基礎となる接続プールを操作する必要があります。

ここでは、実際に 2 つの接続を作成せずに、同じSqlオブジェクトまたはConnectionセキュリティ チェッカー クラスに渡すことができます。また、2 つの接続を作成したとしても、大したことではありません (何らかのループでそれを行っている場合や、何らかのパフォーマンスの問題に直面している場合を除きます)。

1つの提案:挿入には、文字列補間の代わりに構文のような準備済みステートメントを使用します

sql.execute("insert into test (key1, text) values (${foo}, ${text1})")

sql.execute("insert into test (key1, text) values (?, ?)", [foo, text1])

于 2013-08-02T18:17:43.093 に答える