Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down
43 changes: 9 additions & 34 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,31 +36,16 @@

<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.13.0</version>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>6.2.1</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.15.Final</version>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.6.4.Final</version>
<exclusions>
<!-- Provided by javax-activation-api plugin -->
<exclusion>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
</exclusion>
<!-- Provided by jaxb plugin -->
<exclusion>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</exclusion>
<!-- Provided by jaxb plugin -->
<exclusion>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</exclusion>
<!-- Provided by byte-buddy api plugin -->
<exclusion>
<groupId>net.bytebuddy</groupId>
Expand All @@ -69,25 +54,15 @@
</exclusions>
</dependency>

<dependency>
<groupId>io.jenkins.plugins</groupId>
<artifactId>javax-activation-api</artifactId>
</dependency>

<dependency>
<groupId>io.jenkins.plugins</groupId>
<artifactId>byte-buddy-api</artifactId>
</dependency>

<dependency>
<groupId>io.jenkins.plugins</groupId>
<artifactId>jaxb</artifactId>
</dependency>

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
Expand Down
84 changes: 77 additions & 7 deletions src/main/java/org/jenkinsci/plugins/database/BasicDataSource2.java
Original file line number Diff line number Diff line change
@@ -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<? extends Driver> 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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down