diff --git a/README.md b/README.md index 22435b4..331f1e9 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,8 @@ to allow the user to select a database (see ### JPA support -This plugin exposes it through [JPA 2.0 -API](https://en.wikipedia.org/wiki/Java_Persistence_API) (internally, it +This plugin exposes it through [JPA +API](https://en.wikipedia.org/wiki/Java_Persistence_API) using Jakarta Persistence (internally, it uses Hibernate but please do not rely on this fact if you can as it may change.) The entry point to the JPA support is the `PersistenceService` class, and this exposes methods for obtaining `EntityManagerFactory` for @@ -84,6 +84,11 @@ global database, please put `@GlobalTable` in addition to `@Entity`. The following code shows how to use this to persiste a new row: ```java +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.EntityManager; + public class Push { @Inject PersistenceService ps; diff --git a/pom.xml b/pom.xml index 3b7bdb7..e9491d6 100644 --- a/pom.xml +++ b/pom.xml @@ -36,31 +36,16 @@ - org.apache.commons - commons-dbcp2 - 2.13.0 + com.zaxxer + HikariCP + 6.2.1 - org.hibernate - hibernate-entitymanager - 5.6.15.Final + org.hibernate.orm + hibernate-core + 6.6.4.Final - - - javax.activation - javax.activation-api - - - - javax.xml.bind - jaxb-api - - - - org.glassfish.jaxb - jaxb-runtime - net.bytebuddy @@ -69,25 +54,15 @@ - - io.jenkins.plugins - javax-activation-api - - io.jenkins.plugins byte-buddy-api - io.jenkins.plugins - jaxb - - - - javax.validation - validation-api - 2.0.1.Final + jakarta.validation + jakarta.validation-api + 3.1.0 org.hibernate.validator diff --git a/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java b/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java index 7385046..2b0bca2 100644 --- a/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java +++ b/src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java @@ -1,27 +1,97 @@ package org.jenkinsci.plugins.database; -import org.apache.commons.dbcp2.BasicDataSource; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; import javax.sql.DataSource; import java.sql.Driver; import java.sql.SQLException; +import java.util.Properties; /** - * {@link BasicDataSource} with some convenience methods. + * HikariCP-based {@link DataSource} with convenience methods. + * Replaces the deprecated commons-dbcp2 BasicDataSource. * * @author Kohsuke Kawaguchi */ -public class BasicDataSource2 extends BasicDataSource { +public class BasicDataSource2 { + private final HikariConfig config; + public BasicDataSource2() { + this.config = new HikariConfig(); + // Set sensible defaults + config.setAutoCommit(true); + config.setConnectionTimeout(30000); // 30 seconds + config.setIdleTimeout(600000); // 10 minutes + config.setMaxLifetime(1800000); // 30 minutes + config.setMinimumIdle(1); + config.setMaximumPoolSize(10); } public void setDriverClass(Class driverClass) { - setDriverClassName(driverClass.getName()); - setDriverClassLoader(driverClass.getClassLoader()); + config.setDriverClassName(driverClass.getName()); + } + + public void setDriverClassName(String driverClassName) { + config.setDriverClassName(driverClassName); + } + + public void setDriverClassLoader(ClassLoader classLoader) { + // HikariCP doesn't have direct setDriverClassLoader, but we can set it on the config + // The driver will be loaded by the current thread's context classloader + Thread.currentThread().setContextClassLoader(classLoader); + } + + public void setUrl(String url) { + config.setJdbcUrl(url); + } + + public void setUsername(String username) { + config.setUsername(username); + } + + public void setPassword(String password) { + config.setPassword(password); + } + + public void setValidationQuery(String validationQuery) { + if (validationQuery != null && !validationQuery.isEmpty()) { + config.setConnectionTestQuery(validationQuery); + } + } + + public void addConnectionProperty(String name, String value) { + config.addDataSourceProperty(name, value); + } + + public void setInitialSize(Integer initialSize) { + if (initialSize != null) { + config.setMinimumIdle(initialSize); + } + } + + public void setMaxTotal(Integer maxTotal) { + if (maxTotal != null) { + config.setMaximumPoolSize(maxTotal); + } + } + + public void setMaxIdle(Integer maxIdle) { + // HikariCP manages idle connections automatically + // We don't need to set this explicitly + } + + public void setMinIdle(Integer minIdle) { + if (minIdle != null) { + config.setMinimumIdle(minIdle); + } } - @Override public DataSource createDataSource() throws SQLException { - return super.createDataSource(); + try { + return new HikariDataSource(config); + } catch (Exception e) { + throw new SQLException("Failed to create HikariCP DataSource", e); + } } } diff --git a/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java b/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java index 7ae12bd..59faa0f 100644 --- a/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java +++ b/src/main/java/org/jenkinsci/plugins/database/jpa/GlobalTable.java @@ -3,7 +3,7 @@ import org.jenkinsci.plugins.database.GlobalDatabaseConfiguration; import org.jvnet.hudson.annotation_indexer.Indexed; -import javax.persistence.Entity; +import jakarta.persistence.Entity; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; diff --git a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java index baa179b..536b8f4 100644 --- a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java +++ b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceService.java @@ -9,7 +9,7 @@ import edu.umd.cs.findbugs.annotations.CheckForNull; import jakarta.inject.Inject; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.SQLException; diff --git a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java index 8797100..9397917 100644 --- a/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java +++ b/src/main/java/org/jenkinsci/plugins/database/jpa/PersistenceUnitInfoImpl.java @@ -1,10 +1,10 @@ package org.jenkinsci.plugins.database.jpa; -import javax.persistence.SharedCacheMode; -import javax.persistence.ValidationMode; -import javax.persistence.spi.ClassTransformer; -import javax.persistence.spi.PersistenceUnitInfo; -import javax.persistence.spi.PersistenceUnitTransactionType; +import jakarta.persistence.SharedCacheMode; +import jakarta.persistence.ValidationMode; +import jakarta.persistence.spi.ClassTransformer; +import jakarta.persistence.spi.PersistenceUnitInfo; +import jakarta.persistence.spi.PersistenceUnitTransactionType; import javax.sql.DataSource; import java.net.URL; import java.util.AbstractList;