জেপিএ দ্বারা জারি করা এসকিউএল কোয়েরিগুলি কীভাবে দেখুন?


155

যখন আমার কোডটি এ জাতীয় কল দেয়:

entityManager.find(Customer.class, customerID);

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


8
জেপিএ সরবরাহকারী কী? আমি বিশ্বাস করি যে এই সেটিংটি প্রদানকারী নির্দিষ্ট specific
btiernay

@ সাজি দয়া করে আপনি কী অ্যাক্সটাভেটের উত্তরকে স্বীকৃত হিসাবে চিহ্নিত করতে পারেন যাতে এটি দর্শকদের আপনার প্রশ্নের উত্তর সোজা উত্তর দেয়?
8bitjunkie

উত্তর:


332

লগিং বিকল্পগুলি সরবরাহকারীর জন্য নির্দিষ্ট। আপনি কোন JPA বাস্তবায়ন ব্যবহার করবেন তা আপনার জানতে হবে।

  • হাইবারনেট ( এখানে দেখুন ):

    <property name = "hibernate.show_sql" value = "true" />
  • অ্যাকলিপস লিঙ্ক ( এখানে দেখুন ):

    <property name="eclipselink.logging.level" value="FINE"/>
  • ওপেনজেপিএ ( এখানে দেখুন ):

    <property name="openjpa.Log" value="DefaultLevel=WARN,Runtime=INFO,Tool=INFO,SQL=TRACE"/>
  • ডেটা নিউক্লিয়াস ( এখানে দেখুন ):

    DataNucleus.Datastore.Nativeমতো একটি স্তরে লগ বিভাগটি সেট করুন DEBUG


4
@ সাজি: আপনার এই উত্তরটি একটি চেক-মার্ক দেওয়া উচিত যাতে বোঝানো যায় যে এটি গ্রহণযোগ্য উত্তর। হাইবারনেট ব্যবহার করে এটি আমার পক্ষে দুর্দান্ত কাজ করে। আপনি যদি এই উত্তরটি অনুমোদিত করেন তবে আপনি এবং উত্তরদাতা স্ট্যাকওভারফ্লো ডটকম-এ আরও বেশি পয়েন্ট এবং আরও অনুমতি পাবেন।
এলএস

57
কৌতূহলোদ্দীপক যে কোনও শরীরের জন্য আপনি এই লাইনটি আপনার অধ্যবসায়। Xml এ রাখবেন। এটি <প্রপার্টি> নোডের অধীনে থাকবে ... দুঃখিত যদি তা স্পষ্ট হয় তবে আমি নিজেকে কোথায় রাখব সে সম্পর্কে আমি কেবল বিভ্রান্ত হয়ে পড়েছিলাম।
সফটওয়্যারসভান্ট

5
হাইবারনেট এবং লগ 4 জ ব্যবহার করার সময়, আপনি "org.hibernate.SQL" লগারটি DEBUG এ সেট করতে পারেন ( javalobi.org/java/forums/t44119.html )
মোশেইলািশা

অতিরিক্ত হিসাবে, মনে হয় <poperties> নোড <লোকপন্থ- ইউনিট> এর মধ্যে থাকা সমস্ত কিছুর নীচে থাকা দরকার। <3 এক্সএমএল।
টম স্পার্লিং

1
এই সম্পত্তি কোথায় সেট করা উচিত?
অ্যালেক্স ওয়ার্ডেন

34

এছাড়াও, আপনি যদি EclipseLink ব্যবহার করছেন এবং এসকিউএল প্যারামিটার মানগুলি আউটপুট করতে চান তবে আপনি এই সম্পত্তিটিকে আপনার অধ্যবসায়। Xml ফাইলে যুক্ত করতে পারেন:

<property name="eclipselink.logging.parameters" value="true"/>

ইন্টেলিজে বাধ্যতামূলক মানগুলি পাওয়ার কোনও বিকল্প আছে কি?
Vinícius এম

15

আপনি যদি হাইবারনেট এবং লগব্যাকটিকে আপনার লগার হিসাবে ব্যবহার করেন তবে আপনি নিম্নলিখিত ব্যবহার করতে পারেন (কেবলমাত্র বাঁধাই প্রদর্শন করে ফলাফলগুলি নয়):

<appender
    name="STDOUT"
    class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
            %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator>
            <expression>return message.toLowerCase().contains("org.hibernate.type") &amp;&amp;
                logger.startsWith("returning");</expression>
        </evaluator>
        <OnMismatch>NEUTRAL</OnMismatch>
        <OnMatch>DENY</OnMatch>
    </filter>
</appender>

org.hibernate.SQL = DEBUG অনুসন্ধানটি মুদ্রণ করে

<logger name="org.hibernate.SQL">
    <level value="DEBUG" />
</logger>

org.hibernate.type = ট্র্যাক বাইন্ডিংগুলি মুদ্রণ করে এবং সাধারণত ফলাফলগুলি কাস্টম ফিল্টারের মাধ্যমে দমন করা হবে

<logger name="org.hibernate.type">
    <level value="TRACE" />
</logger>

আপনার জ্যানিনো নির্ভরতা প্রয়োজন (http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.6.1</version>
</dependency>

15

রানটাইমের সময় নির্দিষ্ট প্রশ্নের জন্য এসকিউএল পাওয়ার জন্য এক্সপ্লেলিঙ্কে আপনি ডেটাবেসকিউরি API ব্যবহার করতে পারেন:

Query query = em.createNamedQuery("findMe"); 
Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord());

String sqlString = databaseQuery.getSQLString();

এই এসকিউএল থাকবে? পরামিতি জন্য। যুক্তিগুলির সাথে এসকিউএল অনুবাদ করার জন্য আপনার পরামিতি মানগুলির সাথে একটি ডাটাবেস রেকর্ড প্রয়োজন।

DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");

String sqlStringWithArgs = 
         databaseQuery.getTranslatedSQLString(session, recordWithValues);

উত্স: একটি প্রশ্নের জন্য এসকিউএল কীভাবে পাবেন


রেকর্ডওয়থওয়ালিজ কী? এটি কি ডাটাবেসকোয়ারি বা ইজেবিকিউরিআইএমপিএল থেকে পাওয়া সম্ভব?
zmeda

1
রেকর্ড আর্গুমেন্ট (রেকর্ড, এক্সএমএল রেকর্ড) এর মধ্যে একটিতে কোয়েরি যুক্তি রয়েছে
টমাসজ

আমার কাছে যদি কোয়েরি মাইকিউয়ারি = অ্যান্টিম্যানজার.ক্রেটনমেডকুয়েরি ("MyEntity.findMe") এর মতো কিছু থাকে; মাইকিউয়ারি.সেটপ্যারামিটার ("প্যারাম 1", "কিছু ভ্যালু); কীভাবে মাইকিউয়ারি থেকে রেকর্ডওয়থওয়ালিউস পাবেন?
জেডেমে

রেকর্ডওয়থওয়ালিউস তৈরি অন্তর্ভুক্ত করতে আমার উত্তর আপডেট করেছে।
টমাসজ

আরে আপনি কীভাবে জেপিএ দিয়ে চলছে না যে গ্রহগ্রহিংকের জন্য জঞ্জাল বিড়ম্বনার জন্য এটি করবেন জানেন? (এটি ঠিক কী তা আমি জানি না তবে এটি একটি ওয়ার্কব্যাঞ্চ অ্যাপ্লিকেশন থেকে ম্যাপিং-ক্লাস তৈরি করেছে .... তবে আমার কোনও ইএম নেই তবে কেবল একটি শীর্ষলিঙ্ক পরিষেবা আমি একটি সেশনের জন্য আবেদন করতে পারি তবে এটি কোনও জিজ্ঞাসা সম্পর্কে জানে না I রিডএলকিউয়ারি, এক্সপ্রেশনবিল্ডার এবং এক্সপ্রেশন জাতীয় ক্লাসগুলি ব্যবহার করুন You এটির বিষয়ে অস্পষ্ট না হলে আপনার জবাব দেওয়ার দরকার নেই (আমি এতে জেপিএ ব্যবহার করি না) আমি এই মন্তব্যটি পরবর্তী 48 ঘন্টার মধ্যে মুছে ফেলব এবং একটি পরিষ্কার প্রশ্ন জিজ্ঞাসা করার চেষ্টা করব;)
জেবিএ

7

ওপেনজেপিএতে সমস্ত এসকিউএল এবং প্যারামিটারগুলি দেখতে, এই দুটি পরামিতিকে অধ্যবসায়.এক্সএমএল রাখুন:

<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />

5

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

  • log4jdbc
  • jdbcspy

এগুলি কিছু অতিরিক্ত বৈশিষ্ট্যও সরবরাহ করতে পারে যেমন প্রশ্নের অনুসন্ধান এবং পরিসংখ্যান সংগ্রহের জন্য নির্বাহের সময় পরিমাপ করা।


4

Log4j ( src \ log4j.xML ) ব্যবহার করে উদাহরণ :

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

<appender name="CA" class="org.apache.log4j.AsyncAppender">
    <param name="BufferSize" value="512"/>
    <appender-ref ref="CA_OUTPUT"/>
</appender>
<appender name="CA_OUTPUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%p] %d %c %M - %m%n"/>
    </layout>
</appender>

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

<root>
    <level value="WARN"/>
    <appender-ref ref="CA"/>
</root>


1
আপনার উত্তরটি আরও কিছুটা ব্যাখ্যা করুন। আমি ধরে নিলাম মূল বিভাগটি org.hibernate.SQL বিভাগ?
জ্যাকডেভ

2

আমি একটি প্রতারণাপূর্ণ তৈরি করেছি যা আমি মনে করি অন্যের পক্ষে দরকারী হতে পারে। সমস্ত উদাহরণে, আপনি format_sqlযদি লগ ইন করা প্রশ্নগুলি একটি লাইনে রাখতে চান তবে আপনি সম্পত্তিটি সরিয়ে ফেলতে পারেন (কোনও সুন্দর মুদ্রণ নেই)।

খুব সুন্দর প্রিন্ট এসকিউএল কোয়েরি প্রস্তুত স্টেটমেন্টের পরামিতি ছাড়াই এবং লগিং ফ্রেমওয়ার্কের অপ্টিমাইজেশন ছাড়াই স্ট্যান্ডার্ড আউট করার জন্য :

application.properties ফাইল:

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

application.yml ফাইল:

spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true

লগিং ফ্রেমওয়ার্ক ব্যবহার করে প্রস্তুত বিবৃতিগুলির পরামিতিগুলির সাথে প্রিন্ট মুদ্রণ এসকিউএল ক্যোয়ারী :

application.properties ফাইল:

spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

application.yml ফাইল:

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true
logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
        type:
          descriptor:
            sql:
              BasicBinder: TRACE

লগিং ফ্রেমওয়ার্ক ব্যবহার করে প্রস্তুত বিবৃতিগুলির পরামিতি ছাড়াই প্রিন্ট প্রিন্ট এসকিউএল কোয়েরি :

application.properties ফাইল:

spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG

application.yml ফাইল:

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true
logging:
  level:
    org:
      hibernate:
        SQL: DEBUG

উত্স (এবং আরও বিশদ): https://www.baeldung.com/sql-logging-spring-boot


1

অতিরিক্তভাবে, ওয়াইল্ডফ্লাই / জেবস ব্যবহার করে, org.hibernate এর লগিং স্তরটি DEBUG এ সেট করুন

ওয়াইল্ডফ্লাইয়ে হাইবারনেট লগিং


1

আপনার যদি খুব বেশি লগ থাকে এবং আপনি কেবলমাত্র একটি টেম্পোরাল হিসাবে রাখতে চান তবে অন্য একটি ভাল বিকল্পSystem.out.println() , আপনি আপনার সরবরাহকারীর উপর নির্ভর করে এটি করতে পারেন:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<ExaminationType> criteriaQuery = criteriaBuilder.createQuery(getEntityClass()); 

/* For Hibernate */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.hibernate.Query.class).getQueryString());

/* For OpenJPA */ 
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(org.apache.openjpa.persistence.QueryImpl.class).getQueryString());

/* For EclipseLink */
System.out.println(getEntityManager().createQuery(criteriaQuery).unwrap(JpaQuery.class).getSQLString());

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

1

যদি আপনি স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করেন। নীচে হিসাবে আপনার অ্যাপ্লিকেশন.প্রপার্টি ফাইল পরিবর্তন করুন

#Logging JPA Queries, 1st line Log Query. 2nd line Log parameters of prepared statements 
logging.level.org.hibernate.SQL=DEBUG  
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE  

#Logging JdbcTemplate Queries, 1st line Log Query. 2nd line Log parameters of prepared statements 
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG  
logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE  

0

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

দেখে মনে হচ্ছে উত্তরটি হ'ল আমি লগগুলিতে কোনও এসকিউএল দেখতে পাচ্ছি না।
সাজি

1
সাজি, আপনি কীভাবে আপনার অধ্যবসায়.এক্সএমএল হিসাবে সম্পত্তিগুলি ঘোষণা করবেন?
গন্ডিম

0

স্প্রিং বুট সহ কেবল যুক্ত করুন: স্প্রিং.জেপা.শো-এসকিউএল = অ্যাপ্লিকেশন.প্রপ্রেটিসের সত্য। এটি কোয়েরিটি প্রদর্শন করবে তবে প্রকৃত প্যারামিটার ছাড়াই (প্রতিটি প্যারামিটারের পরিবর্তে আপনি দেখতে পাবেন)?


0

শোষণমূলক বিকাশের সময় এবং এসকিউএল ডিবাগিং লগিংকে নির্দিষ্ট পদ্ধতিটিতে যা আমি পরীক্ষা করতে চাই তার উপর ফোকাস করতে, আমি নিম্নলিখিত পদ্ধতিতে লগার বিবৃতি দিয়ে সেই পদ্ধতিটি সাজাই:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;

((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.DEBUG);
entityManager.find(Customer.class, customerID);
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.hibernate.SQL")).setLevel(Level.INFO);

0

এসকিউএল আউটপুট করতে এক্সলিপস লিঙ্ক (দৃ pers়তা.এক্সএমএল কনফিগারেশন):

<property name="eclipselink.logging.level.sql" value="FINE" />

-2

দৃ pers়তা নামে একটি ফাইল রয়েছে x xML টি Ctrl + Shift + R টিপুন এবং এটি সন্ধান করুন, তারপরে শো-এসকিউএল এর মতো কিছু লেখা আছে।

শুধু এটি সত্য হিসাবে রাখা

আমি নিশ্চিত নই যে সার্ভারটি অবশ্যই ডিবাগ মোড হিসাবে চালু করা উচিত। কনসোলে তৈরি এসকিউএল পরীক্ষা করুন।


প্যারামিটারগুলি কি এসকিএল স্টেটমেন্টটি দেখানোর জন্য যথেষ্ট নয়? পরামিতি জন্য।
এবুুজার তাহা কানাত

1
"ShowSQL এর মতো কিছু" এর উত্তর নয়। এবং সিটিআরএল + শিফট + আর? আপনি আইডিই সম্পর্কে একটি ধারণা তৈরি করেছেন।
8bitjunkie
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.