سؤال

الشيء الوحيد الذي دائما يكون الألم هو السجل SQL (JDBC) أخطاء عندما يكون لديك PreparedStatement بدلا من الاستعلام نفسه.

كنت دائما في نهاية المطاف مع رسائل مثل:

2008-10-20 09:19:48,114 ERROR LoggingQueueConsumer-52 [Logger.error:168] Error 
executing SQL: [INSERT INTO private_rooms_bans (room_id, name, user_id, msisdn, 
nickname) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE room_id = ?, name = ?, 
user_id = ?, msisdn = ?, nickname = ?]

بالطبع يمكنني أن أكتب مساعد طريقة لاسترجاع القيم و تحليل/استبدال علامات استفهام مع القيم الحقيقية (و ربما سوف تذهب في هذا الطريق إذا كنت لا تحصل على النتيجة من هذا السؤال) ، ولكن أردت فقط أن أعرف إذا كانت هذه المشكلة تم حلها من قبل شخص آخر و/أو إذا كان هناك أي عام تسجيل المساعد من شأنها أن تفعل ذلك التلقائى بالنسبة لي.

تحريرها بعد بضع إجابات:

المكتبات التي قدمت حتى الآن يبدو أن تكون مناسبة إلى تسجيل البيانات من أجل التصحيح ، والذي لا شك فيه هو مفيد.ومع ذلك ، وأنا أبحث عن طريقة أخذ PreparedStatement نفسها (وليس بعض فرعية) و تسجيل SQL كلما يحدث خطأ.أنا لا ترغب في نشر الإنتاج التطبيق مع بديل تنفيذ PreparedStatement.

أعتقد أن ما أنا أبحث عن فئة فائدة لا PreparedStatement التخصص.

وذلك بفضل!

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

المحلول

حاولت log4jdbc كان هذا العمل بالنسبة لي.

مذكرة الأمن:اعتبارا من اليوم آب / أغسطس 2011 ، يتم تسجيل نتائج log4jdbc إعداد البيان غير آمنة التنفيذ.أنها يمكن أن تستخدم في التحليل ، ولكن لا ينبغي أبدا أن بنك الاحتياطي الفيدرالي مرة أخرى إلى قاعدة البيانات.

على سبيل المثال السجل التي تم إنشاؤها بواسطة logjdbc:

2010/08/12 16:30:56 jdbc.sqlonly org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 8.إدراج في A_TABLE (ID_FILE,CODE1,ID_G,ID_SEQUENCE,REF,NAME,BAR,DRINK_ID,AMOUNT,DESCRIPTION,STATUS,CODE2,REJECT_DESCR,ID_CUST_REJ) القيم (2,'123',1,'2','aa','رهبة',null,'0123',4317.95,'بقبول','0',null,null,null)

المكتبة من السهل جدا أن الإعداد:


بلدي التكوين مع HSQLDB :

jdbc.url=jdbc:log4jdbc:hsqldb:mem:sample

مع أوراكل :

jdbc.url=jdbc:log4jdbc:oracle:thin:@mybdd:1521:smt
jdbc.driverClass=net.sf.log4jdbc.DriverSpy

logback.xml :

<logger name="jdbc.sqlonly" level="DEBUG"/>

سيئة للغاية لم يكن على مستودع مخضرم, ولكن لا تزال مفيدة.
من ما حاولت ، إذا قمت بتعيين

سوف تحصل فقط على البيانات في الخطأ, ومع ذلك, أنا لا أعرف إذا كانت هذه المكتبة له تأثير على الأداء.

نصائح أخرى

هذا هو قاعدة البيانات التي تعتمد على.على سبيل المثال, أنا أفهم أن بعض JDBC (مثلا ، sybase, ربما ms-sql) التعامل مع البيانات المعدة من قبل إنشاء إجراء مخزن مؤقت على الخادم, ومن ثم استدعاء هذا الإجراء مع الموردة الحجج.لذا كاملة SQL أبدا في الواقع مرت من العميل.

ونتيجة لذلك ، JDBC API لا تعرض المعلومات كنت بعد.قد تكون قادرا على أن يلقي البيان كائنات الداخلية السائق التنفيذ ، ولكن ربما لم يكن - appserver قد لف البيانات في التنفيذ الخاصة بها.

أعتقد قد يكون مجرد لدغة الرصاصة والكتابة الخاصة بك الطبقة التي يحرف الحجج إلى النائب SQL.هذا سيكون محرجا لأنه لا يمكنك أن تطلب PreparedStatement عن المعايير التي تم وضعها لذلك عليك أن تذكر لهم في مساعد كائن قبل تمريرها إلى بيان.

يبدو لي أن واحدة من فائدة المكتبات التي لف السائق الخاص بك تنفيذ الأشياء هي الطريقة الأكثر عملية من فعل ما كنت تحاول تحقيق ، ولكن سيكون من غير سارة في كلتا الحالتين.

استخدام P6Spy:لها Oracle, Mysql, JNDI, JMX, الربيع و مخضرم ودية.شكلي للغاية.بسيطة و انخفاض مستوى التكامل يمكن طباعة stacktrace.يمكن طباعة فقط الثقيلة المكالمات - الوقت threashold القائمة.

  1. إذا كنت تستخدم الخلية, الخلية الموصل PreparedStatement.toString() لا تشمل بد المعلمات.على الرغم من طرف ثالث اتصال برك قد كسر هذا.

  2. الفئة الفرعية PreparedStatement لبناء سلسلة الاستعلام كما المعلمات المضافة.لا يوجد طريقة لاستخراج SQL من PreparedStatement ، كما أنه يستخدم جمعت شكل ثنائي.

LoggedPreparedStatement تبدو واعدة ، على الرغم من أنني لم تكن قد حاولت ذلك.

ميزة واحدة من هذه على وكيل السائق الذي يسجل جميع الاستفسارات هو أنه يمكنك تعديل سلسلة الاستعلام قبل تسجيل ذلك.على سبيل المثال في PCI البيئة قد ترغب في إخفاء أرقام بطاقات.

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