হাইবারনেট ব্যবহার করার সময় প্যারামিটার মানগুলির সাথে কীভাবে ক্যোয়ারী স্ট্রিং প্রিন্ট করা যায়


393

হাইবারনেটে কি প্রশ্ন চিহ্নের পরিবর্তে প্রকৃত মান সহ উত্পন্ন এসকিউএল কোয়েরিগুলি মুদ্রণ করা সম্ভব?

হাইবারনেট এপিআই দিয়ে যদি এটি সম্ভব না হয় তবে আপনি কীভাবে সত্যিকারের মানগুলি মুদ্রণ করবেন?


উত্তর:


425

আপনাকে নিম্নলিখিত বিভাগগুলির জন্য লগিং সক্ষম করতে হবে :

  • org.hibernate.SQL   - debugসমস্ত এসকিউএল ডিএমএল বিবৃতি কার্যকর করার সাথে সাথে লগ করতে সেট করুন
  • org.hibernate.type- traceসমস্ত জেডিবিসি পরামিতি লগ করতে সেট করুন

সুতরাং একটি log4j কনফিগারেশন দেখতে দেখতে পারে:

# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug 

# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace 

প্রথমটি hibernate.show_sql=trueউত্তরাধিকার সম্পত্তির সমতুল্য , দ্বিতীয়টি অন্যান্য জিনিসের মধ্যে সীমাবদ্ধ প্যারামিটারগুলি মুদ্রণ করে।

আর একটি সমাধান (হাইবারনেট ভিত্তিক নয়) হ'ল পি 6 এসপির মতো জেডিবিসি প্রক্সি ড্রাইভার ব্যবহার করা ।


11
এটি দরকারী। তবে এটি আমাকে আসল এসকিউএল অনুসন্ধানগুলি দেখায় না।
নিকোলাস বারবুলেসো

6
@ নিকোলাস এটি সত্য, তবে তাত্ক্ষণিকভাবে জিজ্ঞাসাটির পরে এটি বাঁধা পরামিতিগুলি সরবরাহ করে।
এক্সট্রিম বাইকার

2
আমি গ্রিল ২.৪.৪ এবং হাইবারনেট ব্যবহার করছি log. লগ 4 জে কনফিগারেশন পরিবর্তন করা আমার পক্ষে কাজ করে না তবে p6spy কাজ করেছে!
চ্যাম্প

10
হাইবারনেট 5 এ আমরা org.hibernate.type.descriptor.sql.BasicBinderলগার ব্যবহার করতে পারি । org.hibernate.typeআমার জন্য অত্যধিক অপ্রয়োজনীয় তথ্য মুদ্রণ লগ ইন সক্ষম করা ...
csharpfolk

5
org.hibernate.typeএবং org.hibernate.loader.hqlআমার জন্য পরামিতিগুলি দেখানোর জন্য কাজ করবে না
ধেরিক

75

কেবল সুবিধার্থে লগব্যাকের জন্য একই কনফিগারেশন উদাহরণ (এসএলএফ 4 জে)

<appender name="SQLROLLINGFILE">
 <File>/tmp/sql.log</File>
 <rollingPolicy>
  <FileNamePattern>logFile.%d{yyyy-MM-dd}.log</FileNamePattern>
 </rollingPolicy>
 <layout>
  <Pattern>%-4date | %msg %n</Pattern>
 </layout>
</appender>

<logger name="org.hibernate.SQL" additivity="false" >   
 <level value="DEBUG" />    
 <appender-ref ref="SQLROLLINGFILE" />
</logger>

<logger name="org.hibernate.type" additivity="false" >
 <level value="TRACE" />
 <appender-ref ref="SQLROLLINGFILE" />
</logger>

আপনার sql.log (উদাহরণ) এর আউটপুটটি এর পরে দেখায়:

2013-08-30 18:01:15,083 | update stepprovider set created_at=?, lastupdated_at=?, version=?, bundlelocation=?, category_id=?, customer_id=?, description=?, icon_file_id=?, name=?, shareStatus=?, spversion=?, status=?, title=?, type=?, num_used=? where id=?
2013-08-30 18:01:15,084 | binding parameter [1] as [TIMESTAMP] - 2012-07-11 09:57:32.0
2013-08-30 18:01:15,085 | binding parameter [2] as [TIMESTAMP] - Fri Aug 30 18:01:15 CEST 2013
2013-08-30 18:01:15,086 | binding parameter [3] as [INTEGER] -
2013-08-30 18:01:15,086 | binding parameter [4] as [VARCHAR] - com.mypackage.foo
2013-08-30 18:01:15,087 | binding parameter [5] as [VARCHAR] -
2013-08-30 18:01:15,087 | binding parameter [6] as [VARCHAR] -
2013-08-30 18:01:15,087 | binding parameter [7] as [VARCHAR] - TODO
2013-08-30 18:01:15,087 | binding parameter [8] as [VARCHAR] -
2013-08-30 18:01:15,088 | binding parameter [9] as [VARCHAR] - MatchingStep@com.mypackage.foo
2013-08-30 18:01:15,088 | binding parameter [10] as [VARCHAR] - PRIVATE
2013-08-30 18:01:15,088 | binding parameter [11] as [VARCHAR] - 1.0
2013-08-30 18:01:15,088 | binding parameter [12] as [VARCHAR] - 32
2013-08-30 18:01:15,088 | binding parameter [13] as [VARCHAR] - MatchingStep
2013-08-30 18:01:15,089 | binding parameter [14] as [VARCHAR] -
2013-08-30 18:01:15,089 | binding parameter [15] as [INTEGER] - 0
2013-08-30 18:01:15,089 | binding parameter [16] as [VARCHAR] - 053c2e65-5d51-4c09-85f3-2281a1024f64

2
এটি ওপিএস প্রশ্নের উত্তর দিচ্ছে না।
শ্যাডো গেমস

33

এতে পরিবর্তন hibernate.cfg.xmlকরুন:

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

"Log4j.properties" এ log4j এবং নীচের এন্ট্রিগুলি অন্তর্ভুক্ত করুন:

log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout

ধন্যবাদ, আমার জন্য সত্যিই ভাল কাজ করেছে। যারা সেটিংস SQL কোয়েরি মত একটি প্যারামিটার অধীনে যোগ হবে binding parameter [1] as [VARCHAR] - [1]
জি। সিয়ার্ডিনি

28

স্প্রিং বুট ব্যবহারের ক্ষেত্রে কেবল এটি কনফিগার করুন:

aplication.yml

logging:
  level:
    org.hibernate.SQL: DEBUG
    org.hibernate.type: TRACE

aplication.properties

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE

এবং আরও কিছু না।

আছে HTH


20

লগ 4 জেডিবিসি একটি দুর্দান্ত সমাধান যা সঠিক এসকিউএলকে এখানে পরামিতিগুলির সাথে যথাযথ এসকিউএল প্রিন্ট করে যা সর্বাধিক জনপ্রিয় উত্তরের পরিবর্তে এটি করে না। এর একটি প্রধান সুবিধা হ'ল আপনি এসকিউএলটি সরাসরি আপনার ডিবি ফ্রন্ট-এ অনুলিপি করতে পারেন এবং ঠিক তেমন কার্যকর করতে পারেন।

http://log4jdbc.sourceforge.net/

https://code.google.com/p/log4jdbc-remix/

পরবর্তীকালে ক্যোয়ারী ফলাফলগুলির একটি সারণী উপস্থাপনাও আউটপুট করে।

নমুনা আউটপুট উত্সাহিত এসকিউএল উত্সাহিত ফলাফলের সাথে পরীক্ষাগুলির ফলাফলের সাথে একত্রে প্যারামগুলি উপস্থিত রয়েছে:

5. insert into ENQUIRY_APPLICANT_DETAILS (ID, INCLUDED_IN_QUOTE, APPLICANT_ID, TERRITORY_ID, ENQUIRY_ID, ELIGIBLE_FOR_COVER) values (7, 1, 11, 1, 2, 0) 


10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |ID |CREATED |DELETED |CODESET_ID |NAME      |POSITION |PREFIX |
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |2  |null    |null    |1          |Country 2 |1        |60     |
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |---|--------|--------|-----------|----------|---------|-------|

২০১ Update আপডেট করুন

অতি সম্প্রতি আমি এখন এসএলএফ 4 জে এবং লগব্যাক সহ লগ 4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) ব্যবহার করছি। আমার সেট আপের জন্য প্রয়োজনীয় মাভেন নির্ভরতা নীচের মত:

<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>${logback.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>$logback.version}</version>
</dependency>

ড্রাইভার এবং ডিবি ইউআরগুলি এর পরে দেখতে দেখতে:

database.driver.class=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
database.url=jdbc:log4jdbc:hsqldb:mem:db_name #Hsql
#database.url=jdbc:log4jdbc:mysql://localhost:3306/db_name 

আমার লগব্যাক.এক্সএমএল কনফিগারেশন ফাইলটি নীচের মত দেখাচ্ছে: এটি প্যারামিটারগুলির সাথে সমস্ত এসকিউএল স্টেটমেন্টগুলি এবং সমস্ত প্রশ্নের জন্য ফলাফল সেট টেবিলগুলি আউটপুট করে।

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <logger name="jdbc.audit" level="ERROR" />
    <logger name="jdbc.connection" level="ERROR" />
    <logger name="jdbc.sqltiming" level="ERROR" />
    <logger name="jdbc.resultset" level="ERROR" />

    <!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT -->
    <!--<logger name="jdbc.resultsettable" level="ERROR" /> -->

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

পরিশেষে, আমাকে ক্লাসপথের মূল হিসাবে log4jdbc.log4j2.properties নামে একটি ফাইল তৈরি করতে হয়েছিল যেমন মেভন প্রকল্পে src / test / উত্স বা src / main / উত্স। এই ফাইলটির একটি লাইন রয়েছে যা নীচে রয়েছে:

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

উপরেরগুলি আপনার লগিং লাইব্রেরির উপর নির্ভর করবে। আরও তথ্যের জন্য https://code.google.com/archive/p/log4jdbc-log4j2 এ দস্তাবেজগুলি দেখুন

নমুনা আউটপুট:

10:44:29.400 [main] DEBUG jdbc.sqlonly -  org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
5. select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id 
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_, 
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer 
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=104 

10:44:29.402 [main] INFO  jdbc.resultsettable - 
|----------|---|---|----------|--------|---|-----|
|member_id |id |id |member_id |role_id |id |name |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|

1
আরে .... এটিকে দুর্দান্ত মনে হচ্ছে .... ডাক্তার আমাকে ঠিক কী আদেশ করেছেন :) ... তবে এটি কি সিএলওবি / বিএলওবি সমর্থন করে ?? এছাড়াও, ফলাফল সন্ধান নয়, কেবলমাত্র ক্যোয়ারী প্রদর্শন করা সম্ভব? - ধন্যবাদ :)
দেব রে

1
আপনি কীভাবে আমাকে কনফিগারেশনের উদাহরণ দিতে পারেন?
গ্রেপ

প্রকৃতপক্ষে, পরবর্তীগুলির ক্যোয়ারির ফলাফলগুলির একটি তবলু উপস্থাপনা আউটপুট করে ... অর্থাত্ সেই দুর্দান্ত বৈশিষ্ট্যের জন্য লগ 4 জেডিবিসি-রিমিক্স প্রয়োজন।
মেরিটন

এই সমাধানটি আমার পরিস্থিতির জন্য সবচেয়ে ভাল ছিল যেখানে হাইব্রনেট ফলাফলের সেটগুলি সেট করার জন্য আমার সারি নম্বর মানগুলি দেখার দরকার ছিল। ট্রেস লগিং শুধুমাত্র ক্যোয়ারী প্যারামিটার মানগুলি দেখায়।
অলিভার হার্নানডেজ

@ অ্যালান হেই এই লগ নেটিভ প্রশ্নগুলি কি?
সায়ন্তন

9

আপনি log4j.xml এ বিভাগের লাইনগুলি যুক্ত করতে পারেন:

<category name="org.hibernate.type">
    <priority value="TRACE"/>
</category>

এবং হাইবারনেট বৈশিষ্ট্য যুক্ত করুন:

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

7

আপনার লগ 4j বা লগব্যাক কনফিগারেশনে নিম্নলিখিত বৈশিষ্ট্য এবং মান যুক্ত করুন:

org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE

5
org.hibernate.type.descriptor.sql.BasicBinderবিভাগ সকল প্যারামিটার যেমন enum ধরনের অন্তর্ভুক্ত নয়। সুতরাং আপনি যদি সমস্ত কিছু চান তবে আপনার TRACEপুরো org.hibernate.typeদলের প্রয়োজন।
seanf

আমার জন্য এটি হাইবারনেট ৪.৩ এ কাজ করে! এছাড়াও, আমি পুরো org.hibernate.type সন্ধান করব না, কারণ এটি খুব বেশি আউটপুট। বেশিরভাগ ক্ষেত্রে, এই সমাধানটি করবে।
cslotty

নোট করুন যে org.hibernate.type.descriptor.sql.BasicExtractor ফলাফল সেটগুলিতে লগ করে। সুতরাং Eclipse এ কনসোলে লগ ইন করার সময় বড় আকারের এন্ট্রি থাকা এমনকি অ্যাপ্লিকেশনটি ক্র্যাশ করতে পারে এবং আমি মনে করি এটি ফাইলটিতে লগ ইন করার জন্যও আদর্শ নয়। এই কারণেই আমি এই সমাধানটি পছন্দ করি, এটি হাইবারনেট ৩-তেও কাজ করে who তারপরে org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE সেট করুন।
Géza

7

আপনি এই পোস্টে বর্ণিত হিসাবে ডেটাসোর্স-প্রক্সি ব্যবহার করে এটি করতে পারেন ।

ধরে নিই আপনার অ্যাপ্লিকেশনটি dataSourceশিমের প্রত্যাশা করে (যেমন মাধ্যমে @Resource), আপনি এটি কনফিগার করতে পারেন datasource-proxy:

<bean id="actualDataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init"
  destroy-method="close">
    <property name="className" value="bitronix.tm.resource.jdbc.lrc.LrcXADataSource"/>
    <property name="uniqueName" value="actualDataSource"/>
    <property name="minPoolSize" value="0"/>
    <property name="maxPoolSize" value="5"/>
    <property name="allowLocalTransactions" value="false" />
    <property name="driverProperties">
        <props>
            <prop key="user">${jdbc.username}</prop>
            <prop key="password">${jdbc.password}</prop>
            <prop key="url">${jdbc.url}</prop>
            <prop key="driverClassName">${jdbc.driverClassName}</prop>
        </props>
    </property>
</bean>

<bean id="proxyDataSource" class="net.ttddyy.dsproxy.support.ProxyDataSource">
    <property name="dataSource" ref="testDataSource"/>
    <property name="listener">
        <bean class="net.ttddyy.dsproxy.listener.ChainListener">
            <property name="listeners">
                <list>
                    <bean class="net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener">
                        <property name="logLevel" value="INFO"/>
                    </bean>
                    <bean class="net.ttddyy.dsproxy.listener.DataSourceQueryCountListener"/>
                </list>
            </property>
        </bean>
    </property>
</bean>

<alias name="proxyDataSource" alias="dataSource"/>

এখন হাইবারনেট আউটপুট বনাম ডেটাসোর্স-প্রক্সি:

INFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:1, Num:1, Query:{[select company0_.id as id1_6_, company0_.name as name2_6_ from Company company0_][]}
INFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into WarehouseProductInfo (id, quantity) values (default, ?)][19]}
INFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into Product (id, code, company_id, importer_id, name, version) values (default, ?, ?, ?, ?, ?)][phoneCode,1,-5,Phone,0]}

datasource-proxyপ্রশ্নের পরামিতির মান থাকে এবং যাতে আপনি করতে পারেন এমনকি কাস্টম JDBC এর বিবৃতি interceptors খুব যোগ করতে পারেন অধিকার আপনার ইন্টিগ্রেশন পরীক্ষার থেকে n + 1 ক্যোয়ারী সমস্যা ধরা


5

org.hibernate.typeআসল প্যারামিটারগুলি কীভাবে প্রশ্ন চিহ্নের সাথে আবদ্ধ হয় তা দেখতে লগারটি চালু করুন ।


4

<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="logs/system.log" />
    <param name="Append" value="true" />
    <param name="ImmediateFlush" value="true" />
    <param name="MaxFileSize" value="200MB" />
    <param name="MaxBackupIndex" value="100" />

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
    </layout>
</appender>

<appender name="journaldev-hibernate" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="logs/project.log" />
    <param name="Append" value="true" />
    <param name="ImmediateFlush" value="true" />
    <param name="MaxFileSize" value="200MB" />
    <param name="MaxBackupIndex" value="50" />

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
    </layout>
</appender>

<logger name="com.journaldev.hibernate" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="journaldev-hibernate" />
</logger>

<logger name="org.hibernate" additivity="false">
    <level value="INFO" />
    <appender-ref ref="FILE" />
</logger>

<logger name="org.hibernate.type" additivity="false">
    <level value="TRACE" />
    <appender-ref ref="FILE" />
</logger>

<root>
    <priority value="INFO"></priority>
    <appender-ref ref="FILE" />
</root>


3

সমাধানটি সঠিক তবে ফলাফল অবজেক্টগুলির জন্য সমস্ত বাঁধাই লগ করে। এটি প্রতিরোধের জন্য পৃথক অ্যাপেন্ডার তৈরি করা এবং ফিল্টারিং সক্ষম করা সম্ভব example

<!-- A time/date based rolling appender -->
<appender name="FILE_HIBERNATE" class="org.jboss.logging.appender.DailyRollingFileAppender">
    <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
    <param name="File" value="${jboss.server.log.dir}/hiber.log"/>
    <param name="Append" value="false"/>
    <param name="Threshold" value="TRACE"/>
    <!-- Rollover at midnight each day -->
    <param name="DatePattern" value="'.'yyyy-MM-dd"/>

    <layout class="org.apache.log4j.PatternLayout">
        <!-- The default pattern: Date Priority [Category] Message\n -->
        <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
    </layout>

    <filter class="org.apache.log4j.varia.StringMatchFilter">
        <param name="StringToMatch" value="bind" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.StringMatchFilter">
        <param name="StringToMatch" value="select" />
        <param name="AcceptOnMatch" value="true" />
    </filter>  
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender> 

<category name="org.hibernate.type">
  <priority value="TRACE"/>
</category>

<logger name="org.hibernate.type">
   <level value="TRACE"/> 
   <appender-ref ref="FILE_HIBERNATE"/>
</logger>

<logger name="org.hibernate.SQL">
   <level value="TRACE"/> 
   <appender-ref ref="FILE_HIBERNATE"/>
</logger>

3
**If you want hibernate to print generated sql queries with real values instead of question marks.**
**add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true

**And add following entry in log4j.properties :**
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout

আরে উপরের একক লাইনে আপনার হাইবারনেট কনফিগারেশন ফাইলে যুক্ত করতে হবে তবে এটি অবশ্যই কাজ করবে। আমি সবসময় এমন জিনিস পোস্ট করি যা আমি ব্যবহারিকভাবে করেছি।
বিজয় ভট্ট

3

এই উত্তরটি প্রশ্নের কিছুটা ভিন্নতা। কখনও কখনও, আমাদের কেবল রানটাইমের সময় কেবলমাত্র ডিবাগ উদ্দেশ্যেই স্কয়ার প্রয়োজন। সেক্ষেত্রে সম্পাদকদের ডিবাগ ব্যবহার করে আরও সহজ উপায় রয়েছে।

  • Org.hibernate.loader.Loader.loadEntityBatch (বা সেখানে স্ট্যাকের উপরে নেভিগেট) এ একটি ব্রেকপয়েন্ট দিন;
  • যখন এক্সিকিউশন স্থগিত করা হয় তখন ভেরিয়েবল এর মান দেখুন। Sql;

এটি হাইবারনেট ৩ এর জন্য I'm আমি নিশ্চিত নই যে এটি অন্যান্য সংস্করণে কাজ করে।


3

mysql jdbc ড্রাইভার ইতিমধ্যে এই প্রয়োজনীয়তাটি পূরণ করার জন্য একটি সুবিধাজনক সরবরাহ করেছে, আপনার অবশ্যই কমপক্ষে জার সংস্করণ> = mysql- সংযোগ-জার -5.1.6.jar থাকা উচিত

পদক্ষেপ 1: [লগার এবং কাস্টম লগিং যুক্ত করতে আপনার jdbc.url কনফিগার করুন]

    jdbc.url=jdbc:mysql://host:port/your_db?logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true&profilerEventHandler=com.xxx.CustomLoggingProfilerEventHandler

এখন, এটি slf4j লগিং ব্যবহার করছে, আপনার ডিফল্ট লগিং যদি log4j হয় তবে আপনাকে slf4j-api, slf4j-log4j12 নির্ভরতা যুক্ত করতে হবে slf4j লগিং ব্যবহার করতে

পদক্ষেপ 2: [আপনার কাস্টম লগিং লিখুন]

package com.xxx;
import java.sql.SQLException;
import java.util.Properties;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.log.Log;

public class CustomLoggingProfilerEventHandler implements ProfilerEventHandler {
    private Log log;

    public LoggingProfilerEventHandler() {
    }

    public void consumeEvent(ProfilerEvent evt) {
            /**
             * you can only print the sql as        this.log.logInfo(evt.getMessage())
             * you can adjust your sql print log level with: DEBUG,INFO
             * you can also handle the message to meet your requirement
             */ 
            this.log.logInfo(evt);
    }

    public void destroy() {
        this.log = null;
    }

    public void init(Connection conn, Properties props) throws SQLException {
        this.log = conn.getLog();
    }

}

2

আমি log4j এর জন্য এটি পছন্দ করি:

log4j.logger.org.hibernate.SQL=trace
log4j.logger.org.hibernate.engine.query=trace
log4j.logger.org.hibernate.type=trace
log4j.logger.org.hibernate.jdbc=trace
log4j.logger.org.hibernate.type.descriptor.sql.BasicExtractor=error 
log4j.logger.org.hibernate.type.CollectionType=error 

আরে - এটা দুর্দান্ত। তবে আমার মনে হয় এখানে প্রশ্নগুলি মুদ্রিত হয়? পরামিতি মান সহ অনুসরণ করা। যেহেতু আমার অসীম অনেকগুলি প্রশ্ন রয়েছে, তাই আমার এমন কিছু দরকার যা আমি কেবল এসকিএল সম্পাদকের অনুলিপি করতে পারি এবং সেগুলি কার্যকর করা হবে। এই পদ্ধতির ব্যবহার করে আমি কি এমন উপায় করতে পারি? আমি তৃতীয় পক্ষের লাইব্রেরিগুলিতে যেতে আগ্রহী নই। ধন্যবাদ :)
দেব রে

ধন্যবাদ। আমি আশা করছিলাম যে কোনও তৃতীয় পক্ষের সমাধানগুলি ব্যবহার না করে সরাসরি হাইবারনেট না করা উচিত, তবে আমার ধারণা আমার আর কোনও বিকল্প নেই।
দেব রে

2

লগিং কাজ করে তবে ঠিক আপনি চান না বা আমি কিছু সময় আগে চেয়েছিলাম, কিন্তু পি 6 এসপি পুরোপুরি কাজ করে ,

এখানে বাস্তবায়ন করার জন্য সহজ টিউটোরিয়ালটি রয়েছে পি 6 এসপির জন্য এমকিওয়ং টিউটোরিয়াল

আমার জন্য এটি কবজ মত কাজ করে।

  1. P6Spy লাইব্রেরি ডাউনলোড করুন

পাওয়া "পি 6 স্পাই-ইনস্টল.জার"

  1. এটি এক্সট্রাক্ট

p6spy-install.jarফাইলটি বের করুন, দেখুনp6spy.jar এবং দেখুনspy.properties

  1. লাইব্রেরি নির্ভরতা যুক্ত করুন

যোগ p6spy.jarআপনার প্রকল্পের গ্রন্থাগার নির্ভরতা মধ্যে

  1. P6Spy বৈশিষ্ট্য ফাইল পরিবর্তন করুন

আপনার ডাটাবেস কনফিগারেশন ফাইলটি পরিবর্তন করুন। আপনাকে আপনার বিদ্যমান জেডিবিসি ড্রাইভারটিকে পি 6 এসপি জেডিবিসি ড্রাইভারের সাথে প্রতিস্থাপন করতে হবে -com.p6spy.engine.spy.P6SpyDriver

মূল হ'ল মাইএসকিউএল জেডিবিসি ড্রাইভার - com.mysql.jdbc.Driver

<session-factory>
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>

এটি পি 6 এসপি জেডিবিসি ড্রাইভার হিসাবে পরিবর্তন করেছে - com.p6spy.engine.spy.P6SpyDriver

<session-factory>
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver
  </property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>
  1. P6Spy বৈশিষ্ট্য ফাইল পরিবর্তন করুন P6Spy বৈশিষ্ট্য ফাইলটি সংশোধন করুন -spy.properties

real driverআপনার বিদ্যমান মাইএসকিউএল জেডিবিসি ড্রাইভারের সাথে প্রতিস্থাপন করুন

realdriver=com.mysql.jdbc.Driver

#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=

লগ ফাইলের অবস্থান পরিবর্তন করুন লগফাইলে সম্পত্তি লগ ফাইলের অবস্থান পরিবর্তন করুন, সমস্ত এসকিউএল বিবৃতি এই ফাইলে লগইন করবে।

উইন্ডোজ

logfile     = c:/spy.log

* স্নো

logfile     = /srv/log/spy.log
  1. “spy.properties”প্রকল্পের ক্লাসপথে অনুলিপি করুন

“spy.properties”আপনার প্রকল্পের রুট ফোল্ডারে অনুলিপি করুন , নিশ্চিত করুন যে আপনার প্রকল্পটি "স্পাই.পোপার্টি" সনাক্ত করতে পারে, অন্যথায় এটি অনুরোধ করবে “spy.properties”ফাইলটি ব্যতিক্রম পাওয়া যায় নি।


এটি আমার স্প্রিং বুট অ্যাপ্লিকেশনটিতে আমার পক্ষে সহজতম পথ ছিল, যেখানে আমি ইউনিট পরীক্ষা থেকে প্রাপ্ত এসকিউএল লগ করার চেষ্টা করছিলাম। আমি গ্রেডলে একটি পরীক্ষার নির্ভরতা যুক্ত করেছি (টেস্টকোম্পাইল 'পি 6 স্পাই: পি 6 স্পাই: 3.8.5'), অ্যাডজাস্টেড অ্যাপ্লিকেশন.আইএমএল সেট করার জন্য স্প্রিং.ডাটাসোর্স.আরল = জেডিবিসি: পি 6 স্পাই: এইচ 2: মেম: টেস্টডিবি এবং স্প্রিং.ডাটাসোর্স.ড্রাইভার-ক্লাস- নাম = com.p6spy.engine.spy.P6SpyDriver, এবং তারপরে রিয়েলড্রাইভার = org.h2. সহ ড্রাইভ এবং লগফাইলে আমার পছন্দসই পথে সেট করে স্পাই.প্রোপার্টি যুক্ত করেছে। ফলাফলের লগ ফাইল থেকে সম্পূর্ণ এসকিউএল বের করা সহজ ছিল। একমাত্র হিক্কার এইচ 2 জেনারেটেড টাইমস্ট্যাম্প ফর্ম্যাটটি পছন্দ করে নি।
কেন প্রোনোভিচি

2

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" 
      value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
</appender>

<logger name="org.hibernate" additivity="false">
    <level value="INFO" />
    <appender-ref ref="console" />
</logger>

<logger name="org.hibernate.type" additivity="false">
    <level value="TRACE" />
    <appender-ref ref="console" />
</logger>


এটি প্রশ্নের সাথে কীভাবে সম্পর্কিত?
হটজস্ট

2

হাইবারনেট 4 এবং slf4j / log4j2 ব্যবহার করে আমি আমার লগ 4j2.xML কনফিগারেশনে নিম্নলিখিতগুলি যুক্ত করার চেষ্টা করেছি:

<Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace" additivity="false"> 
    <AppenderRef ref="Console"/> 
</Logger> 
<Logger name="org.hibernate.type.EnumType" level="trace" additivity="false"> 
    <AppenderRef ref="Console"/>
</Logger>

কিন্তু সাফল্য ছাড়া।

আমি এই থ্রেডের মাধ্যমে জানতে পারি যে হাইফারনেট দ্বারা ব্যবহৃত jboss-logging ফ্রেমওয়ার্কটি slf4j এর মাধ্যমে লগ করার জন্য কনফিগার করা দরকার to আমি আবেদনের ভিএম যুক্তিতে নিম্নলিখিত যুক্তি যুক্ত করেছি:

-Dorg.jboss.logging.provider=slf4j

এবং এটি একটি কবজ মত কাজ।


2

লগ 4j.file এ নীচে সম্পত্তি রেখে যা আমার জন্য কাজ করেছে তা এখানে:

log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

হাইবারনেট বৈশিষ্ট্য সেটিংস:

hibernate.show_sql=true

2

ওয়াইল্ডফ্লাই (স্ট্যান্ডালোন.এক্সএমএল) এর সাথে বিকাশের জন্য, এই লগার যুক্ত করুন:

<logger category="org.hibernate.SQL">
   <level name="DEBUG"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
   <level name="TRACE"/>
</logger>

1

যদি আপনি হাইবারনেট ৩.২.এক্সএক্স ব্যবহার করেন

log4j.logger.org.hibernate.SQL=trace

পরিবর্তে

log4j.logger.org.hibernate.SQL=debug 

1

আপনি এটি লগ করতে পারেন:

net.sf.hibernate.hql.QueryTranslator

আউটপুট উদাহরণ:

2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL: select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto  from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca' and noti.visible='S' and noti.idmicrosite=985 and noti.tipo=3446

2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL: select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where (traduccion1_.NID_CODIDI='ca' )and(noticia0_.NOT_VISIB='S' )and(noticia0_.NOT_MICCOD=985 )and(noticia0_.NOT_TIPO=3446 )

আরে ... আমি এই পদ্ধতির কোনও উদাহরণ খুঁজে পাচ্ছি না। আপনি কোনও রেফারেন্স / উদাহরণ / টিউটোরিয়াল সরবরাহ করতে পারেন? এবং এটি এখনও সর্বশেষতম সংস্করণগুলি বা হাইবারনেট / লগ 4 জে এর সাথে একই বা এটি কিছু org.hibernate.QueryTranslator বা অন্য কিছুতে পরিণত হয়েছে। ধন্যবাদ
দেব রে 11

আরে ... আমি এটি চেষ্টা করেছি, তবে এটি সংরক্ষণ বা আপডেটের সাথে কাজ করে বলে মনে হচ্ছে না। আমার ধারণা এটি কেবল নির্বাচিত প্রশ্নের জন্য কাজ করে, যেখানে এইচকিএল থেকে এসকিএল অনুবাদ অনুবাদে আসে
দেব রে

1

লগ 4 জেডিবিসি প্লাগইন আপনার প্রয়োজনের জন্য সেরা হবে। এটি নিম্নলিখিত দেখায়-

1. Complete SQL query being hit to the db
2. Parameter values being passed to the query
3. Execution time taken by each query

Log4Jdbc- কনফিগার করতে নীচের লিঙ্কটি দেখুন

https://code.google.com/p/log4jdbc/

1

ওয়্যারশার্ক বা অনুরূপ কিছু ব্যবহার করুন :

উপরে উল্লিখিত উত্তরের কোনওটিই সঠিকভাবে প্যারামিটারগুলির সাথে স্ক্যাকেল প্রিন্ট করবে না বা কোনও ব্যথা। আমি ওয়্যারশার্ক ব্যবহার করে এটি অর্জন করেছি , যা অ্যাপ্লিকেশন থেকে ওয়ার্কেল / মাইএসকিএল ইত্যাদিতে প্রশ্নের সাথে প্রেরণ করা সমস্ত এসকিএল / কমান্ডগুলি ক্যাপচার করে।


2
লগ 4জেডিবিসি করবে। উপরে দেখুন.
অ্যালান হে

1

এখানে থাকা সমস্ত উত্তর সহায়ক, তবে আপনি যদি আপনার সেশন কারখানাটি সেট আপ করতে একটি স্প্রিং অ্যাপ্লিকেশন প্রসঙ্গ XML ব্যবহার করেন, লগ 4 জ এসকিউএল স্তর ভেরিয়েবলটি কেবল আপনাকে সেভাবেই অংশ দেয় তবে আপনাকে হাইবারনেট.শো_এসকিএল ভেরিয়েবল সেট করতে হবে have অ্যাপ্লিকেশনের প্রসঙ্গে নিজেই মানগুলি দেখানো শুরু করতে হাইবারনেট পেতে।

অ্যাপ্লিকেশন কনটেক্সট.এক্সএমএল রয়েছে:

<property name="hibernateProperties">
            <value>
            hibernate.jdbc.batch_size=25
            ... <!-- Other parameter values here -->
            hibernate.show_sql=true
            </value>
 </property>

এবং আপনার log4j ফাইলের প্রয়োজন

log4j.logger.org.hibernate.SQL=DEBUG

1

জাভাতে:

আপনার ক্যোয়ারিকে টাইপকুইয়ারিতে রূপান্তর করুন যদি এটি একটি ক্রেটারিয়াকোয়ারী (জাভ্যাক্স.পারস্পেসিটি) থাকে।

তারপর:

query.unwrap (org.hibernate.Query.class) .getQueryString ();


1
ধন্যবাদ, এটি কোয়েরিটি মুদ্রণ করে, তবে এটি যে পরামিতিগুলি ব্যবহার করে তা নয়, পরামিতিগুলিও মুদ্রণের একটি উপায় আছে?
লিজ ল্যাম্পেরুজে

0

হাইবারনেট কোয়েরি এবং তাদের প্যারামিটার মানগুলি বিভিন্ন লাইনে দেখায়।

যদি আপনি স্প্রিং বুটে অ্যাপ্লিকেশন.প্রপার্টি ব্যবহার করে থাকেন এবং আপনি অ্যাপ্লিকেশন.প্রোপার্টিগুলিতে নীচে হাইলাইটেড প্যারামিটার ব্যবহার করতে পারেন।

  1. org.hibernate.SQL কোয়েরি দেখাবে

    logging.level.org.hibernate.SQL = ডিবাগ

  2. org.hibernate.type সমস্ত পরামিতি মানগুলি দেখায়, যা নির্বাচিত, সন্নিবেশ করানো এবং অনুসন্ধানগুলি আপডেট করার সাথে মানচিত্র করবে map logging.level.org.hibernate.type = ট্রেস

    • org.hibernate.type.EnumType এনাম টাইপ প্যারামিটার মান প্রদর্শন করবে

      logging.level.org.hibernate.type.EnumType = ট্রেস

      উদাহরণ ::

      2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
    • sql.BasicBinder পূর্ণসংখ্যা, বার্চর, বুলিয়ান টাইপ প্যারামিটার মান প্রদর্শন করবে

      logging.level.org.hibernate.type.descriptor.sql.BasicBinder = ট্রেস

      উদাহরণ ::

      • 2018-06-14 11: 28: 29,750 ট্র্যাক [HTTP-nio-9891-exec-2] [বেসিকবাইন্ডার.জভা: 65] বাইন্ডিং পরামিতি [1] [বুলিয়ান] হিসাবে - [সত্য]
      • 2018-06-14 11: 28: 29,751 ট্র্যাক [http-nio-9891-exec-2] [বেসিক বাইন্ডার.জভা: 65] বাইন্ডিং প্যারামিটার [2] [INTEGER] হিসাবে - [1]
      • 2018-06-14 11: 28: 29,752 ট্র্যাক [http-nio-9891-exec-2] [বেসিক বাইন্ডার.জভা: 65] বাইন্ডিং প্যারামিটার [3] [VARCHAR] হিসাবে - [সর্বজনীন]

1
এমনকি এটি কোয়েরিতে সীমাবদ্ধতা এবং অফসেটের মানগুলি দেখায় না ।
T3rm1

0

আমার পক্ষে সহজ সমাধান প্যারামিটার মানগুলি (সরলতার জন্য সমস্ত পরামিতিগুলিকে স্ট্রিং হিসাবে বিবেচনা করে) পরামিতি ইনপুটগুলি প্রতিস্থাপনের জন্য একটি নিয়মিত স্ট্রিংপ্লেস প্রয়োগ করছে:

 String debugedSql = sql;
 //then, for each named parameter
     debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
 //and finnaly
 println(debugedSql);

বা অবস্থানগত পরামিতিগুলির জন্য অনুরূপ কিছু (?)।
নাল মান এবং নির্দিষ্ট মানের ধরণের তারিখের মতো যত্ন নিন, আপনি যদি রান রেড এসকিউএল লগ ইন করতে চান তবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.