Spark Java 框架中的连接池
2022-09-04 04:20:58
我在 Spark Java 中为 MariaDB 配置了 HikariCP 的池化。我没有使用Jetty,而是使用Apache Tomcat。以下是一些代码片段:
src/main/resources/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/example/app/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/example/app/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);
}
}
}
最后,您可以通过调用DataSourceFactory.getMySQLDataSource().getConnection()来获得池化的java.sql.Connection。
应该是可能的,但您必须:
第1)点和第2)点可以像这样简单:
static final HikariDataSource datasource = new HikariDataSource(new HikariConfig());
不知道 Sparkjava 是否支持启动/停止事件。我帮不了你。
(可选)您可以尝试使用jdbc模块 http://jooby.org(我是作者):
{
use(new Jdbc());
get("/db", () -> {
DataSource ds = require(DataSource.class);
});
}
Jdbc模块为您提供了一个具有合理默认选项的HikariDatasource,但同时您可以通过文件自定义池。application.conf
还有几个高级jdbc模块,如Hibernate,Ebean,jOOQ,Jdbi等。