Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wu3Ra-000RQR-3D for pgsql-announce@arkaria.postgresql.org; Wed, 12 Aug 2026 07:32:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wu3RY-005vLn-2t for pgsql-announce@arkaria.postgresql.org; Wed, 12 Aug 2026 07:32:10 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wu3RX-005vKc-20 for pgsql-announce@lists.postgresql.org; Wed, 12 Aug 2026 07:32:08 +0000 Received: from mahout.postgresql.org ([2001:4800:3e1:1::227]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wu3RW-00000000Eo2-1Yuj for pgsql-announce@lists.postgresql.org; Wed, 12 Aug 2026 07:32:07 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=postgresql.org; s=20171124; h=Message-ID:Date:Reply-To:From:To:Subject: MIME-Version:Content-Type:Sender:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:In-Reply-To:References; bh=0rBK1sPcA/ZYLQSmabJLEVmVMqUf0PJjiZtkCZTJXNE=; b=tkcOIidcPWMWGT7nCM4QrS/wXb vtwPiTvHnFlHUEwS2Aggd9IDp+Pp3TY9+sb61AKpsu+274rXPUQeQsAyKUtQrmR5smmQjQJRnhWYR 47yl3OkZ3c0MGz605Z9vSRDW7EcnTYDCnq4Esl6WdwV0hHOXEAXzym5TvLh8x160+gEboUZR7kTy6 FwtZSJ4/T1mLUzz0hXxVIyyfcGPY9A6T34RoUCLa2rkgUiaNJ4Ojnpjz5cONwSgeChu/iJ9cNJoer BLFzxQQ7iW/VxUV4KkUHlfLjN8w+q2U/W0BT9D11dTIrjs9AXHB6qBpTHp9x3b+1XjPUPmi4cgpCh Segns67w==; Received: from wrigleys.postgresql.org ([217.196.149.60]) by mahout.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wu3RW-000hLe-0K for pgsql-announce@lists.postgresql.org; Wed, 12 Aug 2026 07:32:06 +0000 Received: from localhost ([127.0.0.1] helo=wrigleys.postgresql.org) by wrigleys.postgresql.org with esmtp (Exim 4.98.2) (envelope-from ) id 1wu3RT-00000002EqT-33RI for pgsql-announce@lists.postgresql.org; Wed, 12 Aug 2026 07:32:03 +0000 Content-Type: multipart/alternative; boundary="===============6906570099262157066==" MIME-Version: 1.0 Subject: New Modern JDBC Driver for PostgreSQL To: PostgreSQL Announce From: JDBC Project via PostgreSQL Announce Reply-To: davec@postgres.rocks Date: Wed, 12 Aug 2026 07:31:36 +0000 Message-ID: <178651989671.1227.5362920923864736922@wrigleys.postgresql.org> X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-pglister-tags: related X-pglister-tagsig: e6126517dda1d5b29de90bc90b6b9707b164b7aa7465f5fb44df918064b9f6b6 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --===============6906570099262157066== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sehrope Sarkini along with Claude has written a new [JDBC driver](https://g= ithub.com/pgjdbc/pg-java) from scratch. It's currently in pre-release. Here= 's an excerpt from his [blog](https://launchbylunch.com/posts/2026/Jul/29/i= ntroducing-pg-java/)=20 ##PostgreSQL-first.=20 The native API is designed around PostgreSQL's wire protocol and feature se= t. It is not designed around the lowest common denominator that JDBC has to= support across every database on earth. If PostgreSQL can do it, the API s= hould be able to say it directly. ##JDBC as a layer, not a foundation.=20 Full JDBC compliance is a long-term goal. There's already a java.sql.* laye= r that registers a Driver and gives you Connection, PreparedStatement, Resu= ltSet, DatabaseMetaData, DataSource, and XA. But it's built on top of the n= ative API rather than dictating its shape. That ordering matters. Once JDBC= 's assumptions get into the execution core they never come back out. ##Virtual threads for I/O.=20 For a decade, "fast driver" implied an async or reactive API, because the a= lternative was a thread per connection. On Java 21 that trade is gone. pg-j= ava is ordinary blocking-style code that is careful never to pin a carrier = thread (which mostly means ReentrantLock instead of synchronized around I/O= ). You can run thousands of connections on virtual threads without an event= loop or a callback API in sight. It's also significantly easier to reason = about both how it works and how you would use it. ##Streaming by default.=20 The core query primitive is a pull cursor. It reads exactly enough off the = wire to produce the next row and never buffers a whole result set. forEach,= map, collect, and friends are adapters built on top of it, not a second re= ad path. --===============6906570099262157066== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable New Modern JDBC Driver for PostgreSQL
 

New Modern JDBC Driver for PostgreSQL

Sehrope Sarkini along with Claude has writt= en a new JDBC driver from scratch. It's current= ly in pre-release. Here's an excerpt from his blog

PostgreSQL-first.

The native API is designed around PostgreSQ= L's wire protocol and feature set. It is not designed around the lowest com= mon denominator that JDBC has to support across every database on earth. If= PostgreSQL can do it, the API should be able to say it directly.

JDBC as a layer, not a foundati= on.

Full JDBC compliance is a long-term goal. T= here's already a java.sql.* layer that registers a Driver and gives you Con= nection, PreparedStatement, ResultSet, DatabaseMetaData, DataSource, and XA= . But it's built on top of the native API rather than dictating its shape. = That ordering matters. Once JDBC's assumptions get into the execution core = they never come back out.

Virtual threads for I/O.

For a decade, "fast driver" implied an asyn= c or reactive API, because the alternative was a thread per connection. On = Java 21 that trade is gone. pg-java is ordinary blocking-style code that is= careful never to pin a carrier thread (which mostly means ReentrantLock in= stead of synchronized around I/O). You can run thousands of connections on = virtual threads without an event loop or a callback API in sight. It's also= significantly easier to reason about both how it works and how you would u= se it.

Streaming by default.

The core query primitive is a pull cursor. = It reads exactly enough off the wire to produce the next row and never buff= ers a whole result set. forEach, map, collect, and friends are adapters bui= lt on top of it, not a second read path.

This email was sent to you from JDBC Project. It was delivered on their beh= alf by the PostgreSQL project. Any questions about the content of the message shou= ld be sent to JDBC Project.

You were sent this email as a subscriber of the pgsql-announce mai= linglist, for the content tag Related Open Source. To unsubscribe from further emails, or change which emails you want to receive, please click th= e personal unsubscribe link that you can find in the headers of this email, or visit https://lists.postgresql.org/unsubscribe/.
 
--===============6906570099262157066==--