Подтвердить что ты не робот

Объединение пулов в инфраструктуре Spark Java

Java Spark framework использует встроенный Jetty как веб-сервер. Jetty поддерживает объединение пулов с такими инструментами, как HikariCP и предоставляет параметры конфигурации в файлах XML. Однако, согласно эти сообщения, Spark позволяет настроить Jetty. Существует множество примеров использования Spark, но они либо не использовать базу данных или использовать DriverManager для подключения к базе данных.

Можно ли настроить объединение пулов через источник данных и JNDI в искры? Если да, то как?

4b9b3361

Ответ 1

Я настроил объединение в Spark Java с помощью HikariCP для MariaDB. Я не использовал Jetty и вместо этого использовал Apache Tomcat. Вот некоторые фрагменты кода:

SRC/основные/ресурсы/mysql-connection.properties

dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
dataSource.url=<url>
dataSource.user=<user>
dataSource.password=<password>
dataSource.cachePrepStmts=true
dataSource.prepStmtCacheSize=100
dataSource.prepStmtCacheSqlLimit=2048
dataSource.useServerPrepStmts=true
maximumPoolSize=10

COM/пример/приложение/DataSourceFactory.java

public final class DataSourceFactory {

    static final Logger LOG = LoggerFactory.getLogger(DataSourceFactory.class);

    private static DataSource mySQLDataSource;

    private DataSourceFactory() {
    }

    //returns javax.sql.DataSource
    public static DataSource getMySQLDataSource() {
        if (mySQLDataSource == null) {
            synchronized (DataSourceFactory.class) {
                if (mySQLDataSource == null) {
                    mySQLDataSource = getDataSource("mysql-connection.properties");
                }
            }
        }
        return mySQLDataSource;
    }

    // method to create the DataSource based on configuration
    private static DataSource getDataSource(String configurationProperties) {
        Properties conf = new Properties();
        try {
            conf.load(DataSourceFactory.class.getClassLoader().getResourceAsStream(configurationProperties));
        } catch (IOException e) {
            LOG.error("Can't locate database configuration", e);
        }
        HikariConfig config = new HikariConfig(conf);
        HikariDataSource dataSource = new HikariDataSource(config);
        LOG.info("DataSource[" + configurationProperties + "] created " + dataSource);
        return dataSource;
    }

}

WebContent/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                              
    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

    <display-name>My Spark App</display-name>
    <filter>
        <filter-name>SparkFilter</filter-name>
        <filter-class>spark.servlet.SparkFilter</filter-class>
        <init-param>
            <param-name>applicationClass</param-name>
            <param-value>com.example.app.MySparkApp</param-value>
            <!-- MySparkApp implements spark.servlet.SparkApplication -->
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SparkFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>com.example.app.AppServletContextListener</listener-class>
    </listener>
</web-app>

COM/пример/приложение/AppServletContextListener.java

public class AppServletContextListener implements ServletContextListener {

    static final Logger LOG = LoggerFactory.getLogger(AppServletContextListener.class);

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        LOG.info("contextInitialized...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        LOG.info("contextDestroyed...");
        try {
            if (DataSourceFactory.getMySQLDataSource() != null) {
                DataSourceFactory.getMySQLDataSource().unwrap(HikariDataSource.class).close();
            }

        } catch (SQLException e) {
            LOG.error("Problem closing HikariCP pool", e);
        }

    }

}

И, наконец, вы можете получить объединенное соединение java.sql.Connection, вызвав DataSourceFactory.getMySQLDataSource(). getConnection()

Ответ 2

Должно быть возможно, но вы должны:

  • настроить пул
  • сохранить статическую ссылку на источник данных
  • найдите, где начать/подключиться к базе данных и более важно найти способ закрыть/освободить пул.

Точка 1) и 2) может быть такой же простой, как:

static final HikariDataSource datasource = new HikariDataSource(new HikariConfig());

Не знаю, поддерживает ли Sparkjava запуск/остановку событий. Я не могу вам помочь.

При желании вы можете попробовать http://jooby.org (я автор) с модуль jdbc:

{
  use(new Jdbc());

  get("/db", () -> {
    DataSource ds = require(DataSource.class);
  });
}

Модуль Jdbc предоставляет вам HikariDatasource с разумными настройками по умолчанию, но в то же время вы можете настроить пул через application.conf файл.

Есть пара высокоуровневых jdbc modules, например Hibernate, Ebean, jOOQ, Jdbi и т.д.