<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java Archive - CGS IT Solutions GmbH</title>
	<atom:link href="https://cgs.at/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://cgs.at/tag/java/</link>
	<description></description>
	<lastBuildDate>Sat, 21 Mar 2026 14:37:34 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://cgs.at/wp-b59e3-content/uploads/2018/01/cropped-Webisite_ICON-32x32.jpg</url>
	<title>Java Archive - CGS IT Solutions GmbH</title>
	<link>https://cgs.at/tag/java/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>JPA &#038; Hibernate: 5 Performance-Fehler, die fast jedes Projekt macht</title>
		<link>https://cgs.at/jpa-hibernate-5-performance-fehler-die-fast-jedes-projekt-macht/</link>
					<comments>https://cgs.at/jpa-hibernate-5-performance-fehler-die-fast-jedes-projekt-macht/#respond</comments>
		
		<dc:creator><![CDATA[Chris Schäfer]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 07:00:00 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://cgs.at/?p=1097</guid>

					<description><![CDATA[<p>N+1 Queries, Eager Loading, fehlende Projektionen — die häufigsten JPA-Performance-Killer und wie Sie sie vermeiden.</p>
<p>Der Beitrag <a href="https://cgs.at/jpa-hibernate-5-performance-fehler-die-fast-jedes-projekt-macht/">JPA &#038; Hibernate: 5 Performance-Fehler, die fast jedes Projekt macht</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>JPA ist nicht langsam — falscher Einsatz schon</h2>
<p>Hibernate und JPA haben einen schlechten Ruf in Sachen Performance. Aber in den meisten Fällen liegt das Problem nicht beim Framework, sondern bei typischen Anwendungsfehlern, die sich leicht vermeiden lassen.</p>
<p>Hier sind die fünf häufigsten Performance-Killer — und ihre Lösung.</p>
<h2>1. Das N+1 Query Problem</h2>
<p>Der Klassiker. Sie laden eine Liste von Bestellungen, und für jede Bestellung wird eine separate Query für den Kunden ausgeführt.</p>
<p><strong>Das Problem:</strong></p>
<pre><code class="language-java">// 1 Query für Bestellungen + N Queries für Kunden
List&lt;Bestellung&gt; bestellungen = em.createQuery(
    &quot;SELECT b FROM Bestellung b&quot;, Bestellung.class)
    .getResultList();

<p>for (Bestellung b : bestellungen) {
    System.out.println(b.getKunde().getName()); // Lazy Load!
}
</code></pre>
</p>
<p><strong>Die Lösung: JOIN FETCH</strong></p>
<pre><code class="language-java">List&lt;Bestellung&gt; bestellungen = em.createQuery(
    &quot;SELECT b FROM Bestellung b JOIN FETCH b.kunde&quot;,
    Bestellung.class)
    .getResultList();
</code></pre>
<p>Eine Query statt N+1. Bei 1.000 Bestellungen ist das der Unterschied zwischen 1 und 1.001 Datenbankaufrufen.</p>
<h2>2. Eager Loading als Default</h2>
<p><code>@ManyToOne</code> ist standardmäßig <code>EAGER</code> — das bedeutet, jede Relation wird sofort mitgeladen, auch wenn Sie die Daten gar nicht brauchen.</p>
<p><strong>Die Lösung:</strong></p>
<pre><code class="language-java">@ManyToOne(fetch = FetchType.LAZY)
private Kunde kunde;
</code></pre>
<p><strong>Faustregel</strong>: Setzen Sie <strong>alles</strong> auf <code>LAZY</code> und laden Sie gezielt per <code>JOIN FETCH</code> oder <code>EntityGraph</code>, wenn Sie die Daten brauchen.</p>
<h2>3. Fehlende Projektionen</h2>
<p>Sie brauchen nur Name und E-Mail, laden aber die komplette Entity mit 30 Feldern, LOBs und Relationen.</p>
<p><strong>Das Problem:</strong></p>
<pre><code class="language-java">// Lädt ALLES — auch Felder, die Sie nicht brauchen
List&lt;Kunde&gt; kunden = em.createQuery(
    &quot;SELECT k FROM Kunde k&quot;, Kunde.class)
    .getResultList();
</code></pre>
<p><strong>Die Lösung: DTO-Projektionen</strong></p>
<pre><code class="language-java">record KundeDto(String name, String email) {}

<p>List&lt;KundeDto&gt; kunden = em.createQuery(
    &quot;SELECT new at.cgs.dto.KundeDto(k.name, k.email) FROM Kunde k&quot;,
    KundeDto.class)
    .getResultList();
</code></pre>
</p>
<p>Weniger Daten über die Leitung, kein Dirty Checking, kein Managed State — deutlich schneller.</p>
<h2>4. Batch-Operationen ohne Batching</h2>
<p>1.000 Entities einzeln persistieren erzeugt 1.000 INSERT-Statements.</p>
<p><strong>Die Lösung:</strong></p>
<pre><code class="language-properties"># application.properties (Quarkus/Spring)
hibernate.jdbc.batch_size=25
hibernate.order_inserts=true
hibernate.order_updates=true
</code></pre>
<pre><code class="language-java">for (int i = 0; i &lt; entities.size(); i++) {
    em.persist(entities.get(i));
    if (i % 25 == 0) {
        em.flush();
        em.clear(); // First-Level Cache leeren!
    }
}
</code></pre>
<h2>5. Kein Query-Monitoring</h2>
<p>Der gefährlichste Fehler: Sie wissen gar nicht, welche Queries Hibernate generiert.</p>
<p><strong>Aktivieren Sie SQL-Logging in der Entwicklung:</strong></p>
<pre><code class="language-properties"># Quarkus
quarkus.hibernate-orm.log.sql=true

<p># Spring Boot
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql=TRACE
</code></pre>
</p>
<p><strong>Für Produktion</strong>: Nutzen Sie Hibernate Statistics oder ein APM-Tool (z.B. OpenTelemetry) um langsame Queries zu identifizieren.</p>
<h2>Bonus: EntityGraph statt JOIN FETCH</h2>
<p>Für flexible Ladingstrategien ohne Query-Anpassung:</p>
<pre><code class="language-java">@NamedEntityGraph(
    name = &quot;Bestellung.mitKunde&quot;,
    attributeNodes = @NamedAttributeNode(&quot;kunde&quot;)
)
@Entity
public class Bestellung { ... }

<p>// Verwendung
EntityGraph&lt;?&gt; graph = em.getEntityGraph(&quot;Bestellung.mitKunde&quot;);
List&lt;Bestellung&gt; result = em.createQuery(&quot;SELECT b FROM Bestellung b&quot;)
    .setHint(&quot;jakarta.persistence.fetchgraph&quot;, graph)
    .getResultList();
</code></pre>
</p>
<h2>Fazit</h2>
<p>JPA und Hibernate sind mächtige Werkzeuge — aber sie verzeihen Unwissenheit nicht. Die gute Nachricht: Die fünf häufigsten Fehler sind leicht zu erkennen und zu beheben. Aktivieren Sie SQL-Logging, prüfen Sie Ihre Fetch-Strategien, und nutzen Sie Projektionen wo möglich.</p>
<p>In unseren <a href="/schulungen-trainings/">Training-Angeboten</a> behandeln wir JPA-Performance als festen Bestandteil der Java-Entwickler-Ausbildung.</p>
<p>Der Beitrag <a href="https://cgs.at/jpa-hibernate-5-performance-fehler-die-fast-jedes-projekt-macht/">JPA &#038; Hibernate: 5 Performance-Fehler, die fast jedes Projekt macht</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgs.at/jpa-hibernate-5-performance-fehler-die-fast-jedes-projekt-macht/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Microservices oder Monolith? Die ehrliche Antwort</title>
		<link>https://cgs.at/microservices-oder-monolith-die-ehrliche-antwort/</link>
					<comments>https://cgs.at/microservices-oder-monolith-die-ehrliche-antwort/#respond</comments>
		
		<dc:creator><![CDATA[Chris Schäfer]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 07:00:00 +0000</pubDate>
				<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Software Architektur]]></category>
		<category><![CDATA[Clean Architecture]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://cgs.at/?p=1096</guid>

					<description><![CDATA[<p>Nicht jedes System braucht Microservices. Wann sich der Aufwand lohnt — und wann ein gut strukturierter Monolith die bessere Wahl ist.</p>
<p>Der Beitrag <a href="https://cgs.at/microservices-oder-monolith-die-ehrliche-antwort/">Microservices oder Monolith? Die ehrliche Antwort</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Die Microservices-Falle</h2>
<p>Microservices sind seit Jahren der Architektur-Trend schlechthin. Und ja — für die richtige Problemstellung sind sie hervorragend. Aber die Realität zeigt: Viele Teams führen Microservices ein, ohne die Voraussetzungen dafür zu haben.</p>
<p>Das Ergebnis ist kein verteiltes System — sondern ein <strong>verteilter Monolith</strong>: alle Nachteile beider Welten, keine der Vorteile.</p>
<h2>Wann Microservices Sinn machen</h2>
<p>Microservices lösen <strong>organisatorische</strong> Probleme, nicht primär technische:</p>
<p>&#8211; <strong>Mehrere Teams</strong> arbeiten unabhängig an verschiedenen Geschäftsbereichen<br />
&#8211; <strong>Unterschiedliche Release-Zyklen</strong> pro Domäne sind notwendig<br />
&#8211; <strong>Unterschiedliche Skalierungsanforderungen</strong> pro Service<br />
&#8211; <strong>Technologievielfalt</strong> ist gewünscht (ein Service in Java, ein anderer in Python)</p>
<p>Wenn Ihr Team aus 3–5 Entwicklern besteht und eine Anwendung betreut: Microservices sind sehr wahrscheinlich der falsche Ansatz.</p>
<h2>Der gut strukturierte Monolith</h2>
<p>Ein Monolith ist kein Anti-Pattern. Ein <strong>schlecht strukturierter</strong> Monolith ist das Problem. Die Lösung ist nicht automatisch eine Microservice-Architektur, sondern oft ein <strong>Modularer Monolith</strong>:</p>
<p>&#8211; Klare Modul-Grenzen mit definierten APIs<br />
&#8211; Eigene Datenhaltung pro Modul (kein Shared Database)<br />
&#8211; Module können unabhängig getestet werden<br />
&#8211; Spätere Extraktion in Services ist möglich, wenn nötig</p>
<h3>Das Beste aus beiden Welten</h3>
<pre><code class="language-">Monolith mit klaren Modulen
┌──────────────────────────────────┐
│  ┌──────────┐  ┌──────────┐     │
│  │  Bestell- │  │  Kunden- │     │
│  │  wesen    │  │  verw.   │     │
│  │           │  │          │     │
│  └────┬──────┘  └────┬─────┘    │
│       │  definierte   │          │
│       │  Schnittstelle│          │
│  ┌────┴──────┐  ┌────┴─────┐    │
│  │  Lager    │  │  Billing │    │
│  └───────────┘  └──────────┘    │
│                 Ein Deployment   │
└──────────────────────────────────┘
</code></pre>
<h2>Die Kosten von Microservices</h2>
<p>Was selten erwähnt wird — Microservices erfordern erhebliche Infrastruktur:</p>
<table>
<tr>
<th>Thema</th>
<th>Aufwand</th>
</tr>
<tr>
<td><strong>Service Discovery</strong></td>
<td>Consul, Eureka oder Kubernetes DNS</td>
</tr>
<tr>
<td><strong>API Gateway</strong></td>
<td>Routing, Rate Limiting, Auth</td>
</tr>
<tr>
<td><strong>Distributed Tracing</strong></td>
<td>Jaeger, Zipkin oder OpenTelemetry</td>
</tr>
<tr>
<td><strong>Zentrales Logging</strong></td>
<td>ELK Stack oder CloudWatch</td>
</tr>
<tr>
<td><strong>CI/CD pro Service</strong></td>
<td>Eigene Pipeline, eigenes Deployment</td>
</tr>
<tr>
<td><strong>Datenkonsistenz</strong></td>
<td>Saga Pattern, Eventual Consistency</td>
</tr>
<tr>
<td><strong>Netzwerk-Latenz</strong></td>
<td>Jeder Service-Call ist ein Netzwerk-Call</td>
</tr>
</table>
<p>Wenn Sie diese Infrastruktur nicht haben oder nicht betreiben können, werden Microservices zum Bremsklotz statt zum Beschleuniger.</p>
<h2>Entscheidungshilfe</h2>
<p><strong>Starten Sie mit einem Monolith, wenn:</strong><br />
&#8211; Ein Team, ein Produkt<br />
&#8211; Domäne noch nicht vollständig verstanden<br />
&#8211; Schnelle Time-to-Market wichtiger als Skalierbarkeit</p>
<p><strong>Wechseln Sie zu Microservices, wenn:</strong><br />
&#8211; Team-Autonomie das Hauptziel ist<br />
&#8211; Einzelne Domänen unabhängig skaliert werden müssen<br />
&#8211; Sie die Infrastruktur betreiben können (oder wollen)</p>
<h2>Fazit</h2>
<p>Die beste Architektur ist die, die Ihr Team produktiv macht. Für die meisten mittelständischen Unternehmen ist ein modularer Monolith der pragmatischere Weg — mit der Option, gezielt Services zu extrahieren, wenn der Bedarf entsteht.</p>
<p>Bei <strong>CGS IT Solutions</strong> beraten wir technologieneutral: Wir empfehlen die Architektur, die zu Ihrer Organisation passt — nicht die, die gerade im Trend liegt. Mehr dazu unter <a href="/software-architektur/">Software Architektur</a>.</p>
<p>Der Beitrag <a href="https://cgs.at/microservices-oder-monolith-die-ehrliche-antwort/">Microservices oder Monolith? Die ehrliche Antwort</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgs.at/microservices-oder-monolith-die-ehrliche-antwort/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CGS Fragenkatalog: 540+ Quizfragen zu Java und Software Engineering</title>
		<link>https://cgs.at/cgs-fragenkatalog-540-quizfragen-zu-java-und-software-engineering/</link>
					<comments>https://cgs.at/cgs-fragenkatalog-540-quizfragen-zu-java-und-software-engineering/#respond</comments>
		
		<dc:creator><![CDATA[Chris Schäfer]]></dc:creator>
		<pubDate>Sat, 21 Mar 2026 14:37:34 +0000</pubDate>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://cgs.at/?p=1211</guid>

					<description><![CDATA[<p>Kostenloser, browser-basierter Fragenkatalog mit über 540 Fragen zu Java 25 und Software Engineering — mit Sofort-Auswertung, Schwierigkeitsgraden und Fortschritts-Tracking.</p>
<p>Der Beitrag <a href="https://cgs.at/cgs-fragenkatalog-540-quizfragen-zu-java-und-software-engineering/">CGS Fragenkatalog: 540+ Quizfragen zu Java und Software Engineering</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Wer Java lernt oder sein Wissen auffrischen will, kennt das Problem: <strong>Wie gut bin ich wirklich?</strong> Bücher lesen ist das eine — aber gezielt prüfen, ob die Konzepte sitzen, ist etwas anderes.</p>



<p class="wp-block-paragraph">Genau dafür haben wir den <strong>CGS Fragenkatalog</strong> entwickelt: ein kostenloses, browser-basiertes Quiz-Tool mit über <strong>540 Fragen</strong> zu Java und Software Engineering.</p>



<h2 class="wp-block-heading">Was steckt drin?</h2>



<p class="wp-block-paragraph">Der Fragenkatalog besteht aus zwei Teilen:</p>



<ul class="wp-block-list">
<li><strong>Java 25 Fragenkatalog</strong> — 24 Kapitel, 428 Fragen: Von Grundlagen (JVM, Datentypen, Kontrollstrukturen) über Collections, Streams und Generics bis hin zu modernen Features wie Virtual Threads, Pattern Matching und Sealed Classes.</li>
<li><strong>Software Engineering Fragenkatalog</strong> — 12 Kapitel, 115 Fragen: Projektmanagement, Vorgehensmodelle, Qualitätssicherung, Versionskontrolle, UML, Datenbanken und mehr.</li>
</ul>



<h2 class="wp-block-heading">Für wen ist das gedacht?</h2>



<ul class="wp-block-list">
<li><strong>Java-Entwickler:innen</strong>, die ihr Wissen testen und Lücken finden wollen</li>
<li><strong>Studierende</strong>, die sich auf Prüfungen vorbereiten</li>
<li><strong>Workshop-Teilnehmer:innen</strong> unserer Quarkus- und Java-Trainings</li>
<li><strong>Trainer:innen und Lehrende</strong>, die ein fertiges Prüfungstool brauchen</li>
</ul>



<h2 class="wp-block-heading">Features</h2>



<ul class="wp-block-list">
<li><strong>Sofort-Auswertung</strong> — Jede Antwort wird direkt geprüft, mit Erklärung bei falscher Antwort</li>
<li><strong>Schwierigkeitsgrade</strong> — Easy, Medium und Advanced, filterbar</li>
<li><strong>Fortschritt wird gespeichert</strong> — Dank Browser-Speicher geht nichts verloren</li>
<li><strong>Dark/Light Mode</strong> — Augenschonend zu jeder Tageszeit</li>
<li><strong>Syntax-Highlighting</strong> — Java-Code in den Fragen wird korrekt formatiert</li>
<li><strong>Scoreboard</strong> — Live-Übersicht über richtige/falsche Antworten, mit Sprung zu Fehlern</li>
<li><strong>100% im Browser</strong> — Kein Login, kein Server, keine Installation nötig</li>
</ul>



<h2 class="wp-block-heading">Jetzt ausprobieren</h2>



<p class="wp-block-paragraph">Der Fragenkatalog ist kostenlos verfügbar unter <a href="https://quiz.cgs.at/" target="_blank" rel="noopener"><strong>quiz.cgs.at</strong></a> — einfach öffnen und loslegen. Kein Account, keine Registrierung.</p>



<p class="wp-block-paragraph">Sie möchten den Fragenkatalog in Ihrem Unternehmen oder Ihrer Lehrveranstaltung einsetzen? Wir bieten auch <strong>maßgeschneiderte Versionen</strong> mit eigenen Fragen und Auswertung. <a href="/kontakt/">Kontaktieren Sie uns</a> für ein individuelles Angebot.</p>
<p>Der Beitrag <a href="https://cgs.at/cgs-fragenkatalog-540-quizfragen-zu-java-und-software-engineering/">CGS Fragenkatalog: 540+ Quizfragen zu Java und Software Engineering</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgs.at/cgs-fragenkatalog-540-quizfragen-zu-java-und-software-engineering/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Java 21 in der Praxis: Die Features, die Ihren Code verändern</title>
		<link>https://cgs.at/java-21-in-der-praxis-die-features-die-ihren-code-veraendern/</link>
					<comments>https://cgs.at/java-21-in-der-praxis-die-features-die-ihren-code-veraendern/#respond</comments>
		
		<dc:creator><![CDATA[Chris Schäfer]]></dc:creator>
		<pubDate>Sat, 21 Mar 2026 07:00:00 +0000</pubDate>
				<category><![CDATA[Software Entwicklung]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://cgs.at/?p=1099</guid>

					<description><![CDATA[<p>Virtual Threads, Pattern Matching, Records und Sealed Classes — welche Java-21-Features sich im Projektalltag wirklich lohnen.</p>
<p>Der Beitrag <a href="https://cgs.at/java-21-in-der-praxis-die-features-die-ihren-code-veraendern/">Java 21 in der Praxis: Die Features, die Ihren Code verändern</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Java 21: Das wichtigste LTS-Release seit Jahren</h2>
<p>Java 21 ist nicht einfach ein weiteres Update — es ist das umfangreichste LTS-Release seit Java 11. Mit Virtual Threads, ausgereiftem Pattern Matching und Records wird Java zu einer deutlich moderneren Sprache. Hier sind die Features, die im Projektalltag den größten Unterschied machen.</p>
<h2>1. Virtual Threads (Project Loom)</h2>
<p>Das wahrscheinlich wichtigste Feature: Leichtgewichtige Threads, die von der JVM verwaltet werden.</p>
<p><strong>Vorher: Platform Threads</strong></p>
<pre><code class="language-java">// Jeder Thread = ein OS-Thread (~1 MB Stack)
// Bei 10.000 gleichzeitigen Requests: 10 GB RAM nur für Threads
ExecutorService executor = Executors.newFixedThreadPool(200);
</code></pre>
<p><strong>Nachher: Virtual Threads</strong></p>
<pre><code class="language-java">// Millionen gleichzeitiger Threads möglich
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();

<p>// Oder direkt
Thread.startVirtualThread(() -&gt; {
    var result = httpClient.send(request, BodyHandlers.ofString());
    // Blocking ist OK — der Virtual Thread wird geparkt, nicht der OS-Thread
});
</code></pre>
</p>
<p><strong>Wann einsetzen</strong>: Bei I/O-lastigen Anwendungen (REST-APIs, Datenbankzugriffe, HTTP-Clients). Nicht relevant für CPU-intensive Berechnungen.</p>
<p><strong>Quarkus und Spring Boot</strong> unterstützen Virtual Threads bereits — oft reicht eine Konfigurationsänderung.</p>
<h2>2. Pattern Matching for switch</h2>
<p>Typprüfungen und Casts in einem Schritt — deutlich lesbarer als verschachtelte <code>instanceof</code>-Ketten.</p>
<p><strong>Vorher:</strong></p>
<pre><code class="language-java">if (shape instanceof Circle c) {
    return c.radius() <em> c.radius() </em> Math.PI;
} else if (shape instanceof Rectangle r) {
    return r.width() * r.height();
} else {
    throw new IllegalArgumentException(&quot;Unknown shape&quot;);
}
</code></pre>
<p><strong>Nachher:</strong></p>
<pre><code class="language-java">return switch (shape) {
    case Circle c    -&gt; c.radius() <em> c.radius() </em> Math.PI;
    case Rectangle r -&gt; r.width() * r.height();
    default          -&gt; throw new IllegalArgumentException(&quot;Unknown shape&quot;);
};
</code></pre>
<p>In Kombination mit <strong>Sealed Classes</strong> prüft der Compiler Vollständigkeit — kein <code>default</code> nötig:</p>
<pre><code class="language-java">sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}

<p>// Compiler weiß: alle Fälle abgedeckt
double area = switch (shape) {
    case Circle c    -&gt; c.radius() <em> c.radius() </em> Math.PI;
    case Rectangle r -&gt; r.width() * r.height();
};
</code></pre>
</p>
<h2>3. Records für DTOs und Value Objects</h2>
<p>Records eliminieren Boilerplate für unveränderliche Datenobjekte:</p>
<pre><code class="language-java">// Statt 50 Zeilen mit Konstruktor, Getter, equals, hashCode, toString:
record KundeDto(String name, String email, LocalDate registriert) {}

<p>// Verwendung
var kunde = new KundeDto(&quot;Max Mustermann&quot;, &quot;max@example.com&quot;, LocalDate.now());
System.out.println(kunde.name()); // Accessor ohne &quot;get&quot;
</code></pre>
</p>
<p><strong>Ideal für</strong>: JPA-Projektionen, REST-Request/Response-Objekte, Event-Payloads.</p>
<h2>4. Sequenced Collections</h2>
<p>Endlich eine einheitliche API für den Zugriff auf erstes und letztes Element:</p>
<pre><code class="language-java">// Vorher: Inkonsistent
list.get(0);                    // List
set.iterator().next();          // SortedSet
deque.getFirst();               // Deque

<p>// Nachher: Einheitlich
collection.getFirst();
collection.getLast();
collection.reversed();
</code></pre>
</p>
<h2>5. String Templates (Preview)</h2>
<p>Interpolation direkt in Java — kein <code>String.format</code> oder <code>+</code>-Verkettung mehr:</p>
<pre><code class="language-java">// Preview in Java 21, stabil erwartet in Java 23+
String html = STR.&quot;&quot;&quot;
    &lt;h1&gt;\{kunde.name()}&lt;/h1&gt;
    &lt;p&gt;Registriert seit \{kunde.registriert()}&lt;/p&gt;
    &quot;&quot;&quot;;
</code></pre>
<h2>Migration von Java 11/17 auf 21</h2>
<p>Die Migration ist in den meisten Fällen unkompliziert:</p>
<p>1. <strong>Build-Tool aktualisieren</strong>: Maven Compiler Plugin auf Java 21<br />
2. <strong>Dependencies prüfen</strong>: Die meisten Libraries unterstützen Java 21<br />
3. <strong>Deprecated APIs ersetzen</strong>: <code>SecurityManager</code> ist deprecated<br />
4. <strong>Schrittweise Features einführen</strong>: Records und Pattern Matching zuerst, Virtual Threads nach Lasttests</p>
<pre><code class="language-xml">&lt;properties&gt;
    &lt;maven.compiler.source&gt;21&lt;/maven.compiler.source&gt;
    &lt;maven.compiler.target&gt;21&lt;/maven.compiler.target&gt;
&lt;/properties&gt;
</code></pre>
<h2>Fazit</h2>
<p>Java 21 macht die Sprache kompakter, ausdrucksstärker und leistungsfähiger. Virtual Threads allein rechtfertigen die Migration — sie beseitigen das größte Skalierungsproblem von Java-Anwendungen ohne Code-Änderungen.</p>
<p>Wenn Sie noch auf Java 11 oder 17 sind: Die Migration auf 21 lohnt sich. In unseren <a href="/schulungen-trainings/">Schulungen</a> zeigen wir, wie Sie die neuen Features praxisnah in bestehende Projekte integrieren.</p>
<p>Der Beitrag <a href="https://cgs.at/java-21-in-der-praxis-die-features-die-ihren-code-veraendern/">Java 21 in der Praxis: Die Features, die Ihren Code verändern</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgs.at/java-21-in-der-praxis-die-features-die-ihren-code-veraendern/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Quarkus: Der moderne Weg zu Java-Microservices</title>
		<link>https://cgs.at/quarkus-der-moderne-weg-zu-java-microservices/</link>
					<comments>https://cgs.at/quarkus-der-moderne-weg-zu-java-microservices/#respond</comments>
		
		<dc:creator><![CDATA[Chris Schäfer]]></dc:creator>
		<pubDate>Sat, 14 Mar 2026 07:00:00 +0000</pubDate>
				<category><![CDATA[Quarkus]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://cgs.at/?p=1094</guid>

					<description><![CDATA[<p>Warum Quarkus das Java-Ökosystem für Microservices revolutioniert – und wie Sie in 30 Minuten Ihren ersten Service deployen.</p>
<p>Der Beitrag <a href="https://cgs.at/quarkus-der-moderne-weg-zu-java-microservices/">Quarkus: Der moderne Weg zu Java-Microservices</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Warum Quarkus?</h2>
<p>Java-Microservices galten lange als ressourcenhungrig: langsame Startzeiten, hoher Speicherverbrauch, schwerfällige Application Server. Quarkus ändert das grundlegend.</p>
<p>Als <strong>Kubernetes-natives Java-Framework</strong> kombiniert Quarkus das Beste aus dem Java-Enterprise-Ökosystem (CDI, JPA, JAX-RS) mit einer Build-Time-Optimierung, die Startzeiten im Millisekundenbereich und minimalen Speicherverbrauch ermöglicht.</p>
<h2>Die entscheidenden Vorteile</h2>
<h3>1. Build-Time statt Runtime</h3>
<p>Klassische Java-Frameworks wie Spring erledigen viel Arbeit beim Start: Classpath-Scanning, Reflection, Proxy-Generierung. Quarkus verlagert das alles in den Build-Prozess. Das Ergebnis:</p>
<p>&#8211; <strong>Startzeit</strong>: ~0,5 Sekunden (JVM) bzw. ~15 ms (Native)<br />
&#8211; <strong>Speicher</strong>: ~70 MB (JVM) vs. ~300 MB bei klassischen Frameworks<br />
&#8211; <strong>Ideal für Serverless</strong> und Auto-Scaling-Szenarien</p>
<h3>2. Vertraute Standards</h3>
<p>Quarkus setzt auf bewährte Java-Standards — keine neue API zu lernen:</p>
<p>&#8211; <strong>CDI</strong> für Dependency Injection<br />
&#8211; <strong>JAX-RS</strong> (RESTEasy) für REST-Endpoints<br />
&#8211; <strong>JPA</strong> (Hibernate ORM) mit Panache für vereinfachten Datenzugriff<br />
&#8211; <strong>MicroProfile</strong> für Health, Metrics, Config, Fault Tolerance</p>
<h3>3. Developer Experience</h3>
<p>Der Entwicklungsalltag mit Quarkus fühlt sich modern an:</p>
<p>&#8211; <strong>Live Reload</strong>: Code ändern, Browser refreshen — fertig<br />
&#8211; <strong>Dev Services</strong>: Testcontainers starten automatisch (PostgreSQL, Kafka, Redis)<br />
&#8211; <strong>Unified Config</strong>: Eine <code>application.properties</code> für alles</p>
<h2>Quickstart: REST-Service in 5 Minuten</h2>
<pre><code class="language-bash"># Projekt generieren
mvn io.quarkus.platform:quarkus-maven-plugin:create \
  -DprojectGroupId=at.cgs \
  -DprojectArtifactId=demo-service \
  -Dextensions=&quot;resteasy-reactive-jackson,hibernate-orm-panache,jdbc-postgresql&quot;

<p>cd demo-service
./mvnw quarkus:dev
</code></pre>
</p>
<p>Damit haben Sie einen laufenden REST-Service mit Hot-Reload, Dev-UI unter <code>localhost:8080/q/dev/</code> und automatischer PostgreSQL-Testinstanz.</p>
<h2>Wann Quarkus die richtige Wahl ist</h2>
<p>Quarkus eignet sich besonders für:</p>
<p>&#8211; <strong>Neue Microservices</strong> in containerisierten Umgebungen (Kubernetes, OpenShift)<br />
&#8211; <strong>Serverless Functions</strong> (AWS Lambda, Azure Functions)<br />
&#8211; <strong>Event-Driven Architectures</strong> mit Kafka oder AMQP<br />
&#8211; <strong>Teams mit Java-EE-Erfahrung</strong>, die ohne Umlernen modern entwickeln wollen</p>
<p>Weniger geeignet ist es für monolithische Legacy-Anwendungen, die bereits auf Spring Boot aufgebaut sind — hier ist eine Migration selten wirtschaftlich sinnvoll.</p>
<h2>Fazit</h2>
<p>Quarkus ist kein Hype, sondern eine technisch fundierte Antwort auf die Anforderungen moderner Cloud-Architekturen. Wer Java-Microservices entwickelt, sollte Quarkus ernsthaft evaluieren.</p>
<p><strong>CGS IT Solutions</strong> bietet hierzu einen praxisorientierten <a href="/quarkus-microservice-workshop/">Quarkus Microservice Workshop</a> an — von den Grundlagen bis zum produktionsreifen Deployment.</p>
<p>Der Beitrag <a href="https://cgs.at/quarkus-der-moderne-weg-zu-java-microservices/">Quarkus: Der moderne Weg zu Java-Microservices</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgs.at/quarkus-der-moderne-weg-zu-java-microservices/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Software-Architektur: Die 5 Entscheidungen, die alles bestimmen</title>
		<link>https://cgs.at/software-architektur-die-5-entscheidungen-die-alles-bestimmen/</link>
					<comments>https://cgs.at/software-architektur-die-5-entscheidungen-die-alles-bestimmen/#respond</comments>
		
		<dc:creator><![CDATA[Chris Schäfer]]></dc:creator>
		<pubDate>Sat, 07 Mar 2026 07:00:00 +0000</pubDate>
				<category><![CDATA[Software Architektur]]></category>
		<category><![CDATA[Clean Architecture]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://cgs.at/?p=1098</guid>

					<description><![CDATA[<p>Architektur-Entscheidungen sind schwer rückgängig zu machen. Welche fünf Weichenstellungen den größten Einfluss auf Ihr Projekt haben.</p>
<p>Der Beitrag <a href="https://cgs.at/software-architektur-die-5-entscheidungen-die-alles-bestimmen/">Software-Architektur: Die 5 Entscheidungen, die alles bestimmen</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Architektur ist kein Diagramm</h2>
<p>Software-Architektur wird oft mit Boxen und Pfeilen gleichgesetzt. Aber Architektur sind die <strong>Entscheidungen, die schwer rückgängig zu machen sind</strong> — und die den Rahmen für alles Weitere setzen.</p>
<p>Hier sind die fünf Entscheidungen, die den größten Einfluss auf den Erfolg eines Softwareprojekts haben.</p>
<h2>1. Synchron oder Asynchron?</h2>
<p>Die fundamentalste Entscheidung: Kommunizieren Ihre Komponenten synchron (Request/Response) oder asynchron (Events/Messages)?</p>
<p><strong>Synchron</strong> (REST, gRPC):<br />
&#8211; Einfacher zu verstehen und zu debuggen<br />
&#8211; Direkte Fehlermeldung an den Aufrufer<br />
&#8211; Enge Kopplung zwischen Sender und Empfänger</p>
<p><strong>Asynchron</strong> (Kafka, RabbitMQ, SQS):<br />
&#8211; Lose Kopplung, höhere Resilienz<br />
&#8211; Natürliche Skalierbarkeit durch Queues<br />
&#8211; Komplexeres Fehlerhandling, Eventual Consistency</p>
<p><strong>Empfehlung</strong>: Starten Sie synchron und führen Sie Asynchronität gezielt ein, wo sie Probleme löst — nicht als Grundsatzentscheidung.</p>
<h2>2. Datenhoheit: Shared Database oder Database per Service?</h2>
<p>Teilen sich Ihre Services eine Datenbank — oder hat jeder Service seine eigene?</p>
<table>
<tr>
<th>Aspekt</th>
<th>Shared DB</th>
<th>DB per Service</th>
</tr>
<tr>
<td>Konsistenz</td>
<td>Einfach (Transaktionen)</td>
<td>Komplex (Sagas)</td>
</tr>
<tr>
<td>Kopplung</td>
<td>Hoch (Schema-Änderungen betreffen alle)</td>
<td>Niedrig</td>
</tr>
<tr>
<td>Performance</td>
<td>Joins möglich</td>
<td>Kein Cross-Service-Join</td>
</tr>
<tr>
<td>Betrieb</td>
<td>Ein Cluster</td>
<td>Mehrere Cluster</td>
</tr>
</table>
<p><strong>Die Wahrheit</strong>: Die meisten Systeme brauchen einen Mittelweg. Logische Trennung (eigenes Schema pro Service) mit physisch geteilter Infrastruktur ist oft der pragmatische Start.</p>
<h2>3. Deployment-Einheit: Monolith, Modulith oder Microservices?</h2>
<p>Diese Entscheidung bestimmt Ihre gesamte Infrastruktur, CI/CD-Pipeline und Team-Organisation:</p>
<p>&#8211; <strong>Monolith</strong>: Ein Artefakt, einfaches Deployment, ein Team<br />
&#8211; <strong>Modulith</strong>: Ein Artefakt mit klaren internen Grenzen, mehrere Teams möglich<br />
&#8211; <strong>Microservices</strong>: Mehrere Artefakte, unabhängiges Deployment, Team-pro-Service</p>
<p>Die Entscheidung hängt weniger von der Technik ab als von der <strong>Teamgröße und -struktur</strong> (Conway&#8217;s Law).</p>
<h2>4. Frontend-Architektur: Server-Rendered oder SPA?</h2>
<p>Oft unterschätzt, aber schwer zu ändern:</p>
<p><strong>Server-Side Rendering</strong> (Thymeleaf, JSF, HTMX):<br />
&#8211; Weniger Komplexität, kein separater Build-Prozess<br />
&#8211; SEO-freundlich out of the box<br />
&#8211; Gut für content-lastige Anwendungen</p>
<p><strong>Single Page Application</strong> (React, Angular, Vue):<br />
&#8211; Reichere Interaktivität<br />
&#8211; Eigenes Team für Frontend möglich<br />
&#8211; API-first ermöglicht mehrere Clients (Web, Mobile)</p>
<p><strong>Trend</strong>: HTMX und Server Components (React) bringen die Welten zusammen.</p>
<h2>5. Fehlerbehandlungsstrategie</h2>
<p>Die am häufigsten vergessene Architekturentscheidung: Was passiert, wenn etwas schiefgeht?</p>
<p>Definieren Sie frühzeitig:<br />
&#8211; <strong>Circuit Breaker</strong>: Wann wird ein abhängiger Service als „down&#8220; betrachtet?<br />
&#8211; <strong>Retry-Strategie</strong>: Wie oft, mit welchem Backoff?<br />
&#8211; <strong>Fallback-Verhalten</strong>: Degraded Mode oder Fehlerseite?<br />
&#8211; <strong>Timeout-Budgets</strong>: Wie lange darf ein Request maximal dauern?</p>
<p>Ohne diese Entscheidungen wird Ihr System bei der ersten Störung kaskadierend ausfallen.</p>
<h2>Architektur-Entscheidungen dokumentieren</h2>
<p>Nutzen Sie <strong>Architecture Decision Records (ADRs)</strong> — kurze Dokumente, die festhalten:</p>
<p>1. <strong>Kontext</strong>: Welches Problem lösen wir?<br />
2. <strong>Entscheidung</strong>: Was haben wir entschieden?<br />
3. <strong>Konsequenzen</strong>: Was folgt daraus (positiv und negativ)?</p>
<pre><code class="language-markdown"># ADR-001: Asynchrone Kommunikation für Bestellprozess

<h2>Kontext</h2>
Der Bestellprozess muss 5 nachgelagerte Systeme benachrichtigen.
Synchrone Aufrufe führen zu Timeouts bei Last.

<h2>Entscheidung</h2>
Wir verwenden Apache Kafka für die Event-basierte
Kommunikation im Bestellprozess.

<h2>Konsequenzen</h2>
+ Lose Kopplung, keine kaskadierenden Fehler
+ Natürliche Skalierbarkeit
- Eventual Consistency, kein sofortiges Feedback
- Zusätzliche Infrastruktur (Kafka Cluster)
</code></pre>
<h2>Fazit</h2>
<p>Gute Architektur entsteht nicht durch die Wahl des richtigen Frameworks, sondern durch bewusste Entscheidungen an den richtigen Stellen. Nehmen Sie sich Zeit für diese fünf Weichenstellungen — sie bestimmen den Erfolg Ihres Projekts mehr als jede Technologiewahl.</p>
<p>Bei <strong>CGS IT Solutions</strong> unterstützen wir Sie als <a href="/software-architektur/">Software-Architekten</a> bei genau diesen Entscheidungen — pragmatisch, erfahrungsbasiert und technologieneutral.</p>
<p>Der Beitrag <a href="https://cgs.at/software-architektur-die-5-entscheidungen-die-alles-bestimmen/">Software-Architektur: Die 5 Entscheidungen, die alles bestimmen</a> erschien zuerst auf <a href="https://cgs.at">CGS IT Solutions GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgs.at/software-architektur-die-5-entscheidungen-die-alles-bestimmen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
