سؤال

هل لدى أي أحد الأمثلة على كيفية استخدام DBMS_APPLICATION_INFO حزمة مع جبوس?

لدينا العديد من التطبيقات التي تعمل داخل جبوس وتبادل db حمامات.أود في بداية كل دورة هذه التطبيقات لتحديد أنفسهم إلى قاعدة البيانات باستخدام DBMS_APPLICATION_INFO لذلك أنا يمكن بسهولة تتبع أي أقسام التطبيق يسبب مشاكل قاعدة البيانات.

أنا لم تكن مألوفة جدا مع الدورة من دورات الحياة في جبوس, ولكن في نهاية اليوم, ما يجب أن يحدث في بداية و نهاية الصفقة ، هذه الحزمة يجب أن يكون.

وقد أي شخص من أي فعلت هذا من قبل ؟

هل كانت مفيدة؟

المحلول

نعم ، يمكنك كتابة المجمع الدرجة حول تجمع الاتصال ، wraper حول اتصال لذلك دعونا نقول لديك:

OracleConnection conn=connectionPool.getConnection("java:scott@mydb");

تغييره إلى:

public class LoggingConnectionPool extends ConnectionPool{
    public OracleConnection getConnection(String datasourceName, String module, String action){
        OracleConnection conn=getConnection(datasourceName);
        CallableStatement call=conn.preparedCall("begin dbms_application_info.setModule(module_name => ?, action_name => ?); end;");
        try{
            call.setString(1,module);
            call.setString(2,action);
            call.execute();
        finally{
            call.close();
        }
        return new WrappedOracleConnection(conn);
    }

لاحظ استخدام WrappedOracleConnection أعلاه.كنت بحاجة إلى هذا لأنك بحاجة إلى اعتراض مكالمة قريبة

public class WrappedOracleConnection extends OracleConnection{
    public void close(){
        CallableStatement call=this.preparedCall("begin dbms_application_info.setModule(module_name => ?, action_name => ?); end;");
        try{
            call.setNull(1,Types.VARCHAR);
            call.setNull(2,Types.VARCHAR);
            call.execute();
        finally{
            call.close();
        }
    }

    // and you need to implement every other method
    //for example
    public CallableStatement prepareCall(String command){
        return super.prepareCall(command);
    }
    ...
}

ويساعد هذا الأمل ، أفعل شيئا من هذا القبيل على الخادم التنمية للقبض على الاتصالات التي ليست مغلقة (لا عاد إلى بركة).

نصائح أخرى

إذا كنت تستخدم جبوس ، يمكنك استخدام "صالحة-اتصال-مدقق".هذه الفئة هي عادة تستخدم للتحقق من صحة الاتصال.ولكن ، كما سيتم استدعاؤه في كل مرة تجمع الاتصال يعطي المستخدم اتصال, يمكنك استخدامه لتعيين DBMS_ تطبيق _INFO.

تعلن مثل هذه الدرجة في oracle-ds.xml مثل هذا:

<local-tx-datasource>
    <jndi-name>jdbc/myDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@10.10.1.15:1521:SID</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <security-domain>MyEncryptDBPassword</security-domain>
    <valid-connection-checker-class-name>test.MyValidConn</valid-connection-checker-class-name>
    <metadata>
        <type-mapping>Oracle9i</type-mapping>
    </metadata>
</local-tx-datasource>

الفئة يجب أن تنفذ org.جبوس.الموارد.محول.jdbc.ValidConnectionChecker واجهة.إذا كنت تستخدم مخضرم ، ويمكن أن تشمل هذه الواجهة التالية التبعية:

<dependency>
    <groupId>jboss</groupId>
    <artifactId>jboss-common-jdbc-wrapper</artifactId>
    <version>3.2.3</version>
    <scope>provided</scope>
</dependency>

هذه واجهة واحدة فقط الطريقة:isValidConnection.أنا نسختي التنفيذ:

public SQLException isValidConnection(Connection arg0) {
    CallableStatement statement;
    try {
        statement = arg0.prepareCall("call dbms_application_info.set_client_info('"+getInfos()+"')");
        statement.execute();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

نأمل أن يساعد !

Benoît

في -ds.xml, يمكنك تعيين اتصال خاصية تسمى v$الدورة.البرنامج و قيمة هذا العقار سوف ملء البرنامج عمود من كل دورة في V$الدورة عرض إنشاء اتصالات تنشأ من تجمع الاتصال.وعادة ما تعيينها إلى جبوس.الملقم.اسم مكان الإقامة.

انظر هنا على سبيل المثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top