{"id":258,"date":"2024-03-02T01:57:44","date_gmt":"2024-03-02T00:57:44","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=258"},"modified":"2024-03-03T02:01:36","modified_gmt":"2024-03-03T01:01:36","slug":"sql-queries-mit-spring-data-jpa-loggen","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=258","title":{"rendered":"SQL-Queries mit Spring Data JPA loggen"},"content":{"rendered":"\n<p>Spring Data JPA ist ein leistungsstarkes Framework, das die Entwicklung von Datenzugriffsschichten in Java-Anwendungen erleichtert. Es erm\u00f6glicht die Nutzung von JPA (Java Persistence API) in Verbindung mit dem Spring-Framework, was die Implementierung von Datenbankzugriffsschichten vereinfacht. Das Loggen von SQL-Queries ist eine wichtige Praxis, um die Leistung der Datenbankabfragen zu \u00fcberwachen, Fehler zu beheben und die Anwendung zu optimieren. In diesem Artikel werden wir uns darauf konzentrieren, wie Sie SQL-Queries in einer Spring Data JPA-Anwendung effektiv loggen k\u00f6nnen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Warum SQL-Queries loggen?<\/strong><\/h3>\n\n\n\n<p>Das Loggen von SQL-Queries bietet mehrere Vorteile, darunter:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Leistungs\u00fcberwachung:<\/strong> Durch das Protokollieren von SQL-Queries k\u00f6nnen Sie die Leistung Ihrer Datenbankabfragen \u00fcberwachen und Engp\u00e4sse identifizieren.<\/li>\n\n\n\n<li><strong>Fehlerbehebung:<\/strong> Protokollierte SQL-Queries erleichtern die Fehlerdiagnose, da Sie genau sehen k\u00f6nnen, welche Abfrage zu einem bestimmten Zeitpunkt ausgef\u00fchrt wurde.<\/li>\n\n\n\n<li><strong>Optimierung:<\/strong> Durch das \u00dcberwachen der ausgef\u00fchrten SQL-Queries k\u00f6nnen Sie Optimierungsm\u00f6glichkeiten erkennen und ineffiziente Abfragen identifizieren.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Loggen von SQL-Queries in Spring Data JPA<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>1. Konfiguration von Log4j oder Logback:<\/strong><\/h4>\n\n\n\n<p>Um SQL-Queries zu loggen, ben\u00f6tigen Sie ein geeignetes Logging-Framework wie Log4j oder Logback. Hier ist ein Beispiel f\u00fcr die Konfiguration von Logback in einer typischen <code>logback.xml<\/code>-Datei:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"CONSOLE\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"ch.qos.logback.core.ConsoleAppender\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">encoder<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pattern<\/span>&gt;<\/span>%d{HH:mm:ss.SSS} &#91;%thread] %-5level %logger{36} - %msg%n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">pattern<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">encoder<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">appender<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">logger<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"org.hibernate.SQL\"<\/span> <span class=\"hljs-attr\">level<\/span>=<span class=\"hljs-string\">\"DEBUG\"<\/span> <span class=\"hljs-attr\">additivity<\/span>=<span class=\"hljs-string\">\"false\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"CONSOLE\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">logger<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">root<\/span> <span class=\"hljs-attr\">level<\/span>=<span class=\"hljs-string\">\"INFO\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">appender-ref<\/span> <span class=\"hljs-attr\">ref<\/span>=<span class=\"hljs-string\">\"CONSOLE\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">root<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">configuration<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Stellen Sie sicher, dass die entsprechenden Abh\u00e4ngigkeiten f\u00fcr Logback in Ihrer Maven- oder Gradle-Konfiguration hinzugef\u00fcgt sind.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2. Aktivierung der SQL-Query-Protokollierung in Spring Boot:<\/strong><\/h4>\n\n\n\n<p>In einer Spring Boot-Anwendung k\u00f6nnen Sie die SQL-Query-Protokollierung direkt in der <code>application.properties<\/code>&#8211; oder <code>application.yml<\/code>-Datei aktivieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Spring Data JPA Hibernate SQL-Query-Protokollierung aktivieren<\/span>\nspring.jpa.show-sql=<span class=\"hljs-keyword\">true<\/span>\n\n<span class=\"hljs-comment\"># Formatierung der SQL-Queries f\u00fcr bessere Lesbarkeit<\/span>\nspring.jpa.properties.hibernate.format_sql=<span class=\"hljs-keyword\">true<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mit diesen Einstellungen gibt Spring Boot automatisch die ausgef\u00fchrten SQL-Queries auf der Konsole aus.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>3. Benutzerdefinierte SQL-Query-Protokollierung:<\/strong><\/h4>\n\n\n\n<p>Wenn Sie mehr Kontrolle \u00fcber die Protokollierung ben\u00f6tigen, k\u00f6nnen Sie eine benutzerdefinierte Logik implementieren. Hier ist ein Beispiel f\u00fcr einen Aspekt (Aspect) in Spring, der SQL-Queries protokolliert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Aspect\n@Component\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SqlQueryLoggingAspect<\/span> <\/span>{\n\n    private <span class=\"hljs-keyword\">static<\/span> final Logger logger = LoggerFactory.getLogger(SqlQueryLoggingAspect.class);\n\n    @Autowired\n    private EntityManager entityManager;\n\n    @Pointcut(<span class=\"hljs-string\">\"execution(* org.springframework.data.jpa.repository.JpaRepository+.*(..))\"<\/span>)\n    public <span class=\"hljs-keyword\">void<\/span> jpaRepositoryMethods() {}\n\n    @Around(<span class=\"hljs-string\">\"jpaRepositoryMethods()\"<\/span>)\n    public <span class=\"hljs-built_in\">Object<\/span> logSqlQueries(ProceedingJoinPoint joinPoint) throws Throwable {\n        <span class=\"hljs-keyword\">if<\/span> (logger.isDebugEnabled()) {\n            <span class=\"hljs-built_in\">String<\/span> methodName = joinPoint.getSignature().getName();\n            <span class=\"hljs-built_in\">String<\/span> queryString = getQueryString(joinPoint);\n            logger.debug(<span class=\"hljs-string\">\"Executing SQL Query in method {}: {}\"<\/span>, methodName, queryString);\n        }\n        <span class=\"hljs-keyword\">return<\/span> joinPoint.proceed();\n    }\n\n    private <span class=\"hljs-built_in\">String<\/span> getQueryString(ProceedingJoinPoint joinPoint) {\n        MethodSignature signature = (MethodSignature) joinPoint.getSignature();\n        Method method = signature.getMethod();\n        Class&lt;?&gt; entityClass = DataUtils.resolveReturnedGenericType(method, JpaRepository.class);\n\n        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();\n        CriteriaQuery&lt;<span class=\"hljs-built_in\">Object<\/span>&gt; criteriaQuery = criteriaBuilder.createQuery(entityClass);\n        Root&lt;<span class=\"hljs-built_in\">Object<\/span>&gt; root = criteriaQuery.from(entityClass);\n        criteriaQuery.select(root);\n        Predicate predicate = criteriaBuilder.conjunction();\n        criteriaQuery.where(predicate);\n\n        <span class=\"hljs-built_in\">String<\/span> queryString = entityManager.createQuery(criteriaQuery).unwrap(org.hibernate.query.Query.class).getQueryString();\n        <span class=\"hljs-keyword\">return<\/span> queryString;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dieser Aspekt erfasst alle Aufrufe von Methoden, die von Spring Data JPA Repositories bereitgestellt werden, und protokolliert die zugeh\u00f6rigen SQL-Queries.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Fazit:<\/strong><\/h3>\n\n\n\n<p>Das Loggen von SQL-Queries in einer Spring Data JPA-Anwendung ist entscheidend f\u00fcr die \u00dcberwachung, Fehlerbehebung und Optimierung von Datenbankabfragen. Die Verwendung von eingebauten Spring Boot-Einstellungen oder die Implementierung benutzerdefinierter Protokollierung mit Aspekten bieten verschiedene M\u00f6glichkeiten, um sicherzustellen, dass Sie die ben\u00f6tigten Informationen erhalten. W\u00e4hlen Sie die Methode, die am besten zu den Anforderungen Ihrer Anwendung passt, und verbessern Sie so die Effizienz und Wartbarkeit Ihrer Datenzugriffsschicht.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring Data JPA ist ein leistungsstarkes Framework, das die Entwicklung von Datenzugriffsschichten in Java-Anwendungen erleichtert. Es erm\u00f6glicht die Nutzung von JPA (Java Persistence API) in Verbindung mit dem Spring-Framework, was die Implementierung von Datenbankzugriffsschichten vereinfacht. Das Loggen von SQL-Queries ist eine wichtige Praxis, um die Leistung der Datenbankabfragen zu \u00fcberwachen, Fehler zu beheben und die [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-258","post","type-post","status-publish","format-standard","hentry","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=258"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions"}],"predecessor-version":[{"id":259,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/258\/revisions\/259"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}