From 7e3d4c220b3d09b59897736255a62b30534ef49d Mon Sep 17 00:00:00 2001 From: hzhang2 Date: Mon, 7 Aug 2017 17:26:37 -0700 Subject: [PATCH] fix hibernate connection pool only support mysql issue (#641) --- .../app/controllers/Application.java | 139 +++++++++--------- wherehows-backend/application.env | 4 + wherehows-backend/conf/application.conf | 16 +- .../dao/ConnectionPoolProperties.java | 64 ++++++++ 4 files changed, 148 insertions(+), 75 deletions(-) create mode 100644 wherehows-dao/src/main/java/wherehows/dao/ConnectionPoolProperties.java diff --git a/wherehows-backend/app/controllers/Application.java b/wherehows-backend/app/controllers/Application.java index 7c10915387..b224defc7b 100644 --- a/wherehows-backend/app/controllers/Application.java +++ b/wherehows-backend/app/controllers/Application.java @@ -18,7 +18,6 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Constructor; -import java.util.HashMap; import java.util.Map; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; @@ -28,88 +27,84 @@ import play.Logger; import play.Play; import play.mvc.Controller; import play.mvc.Result; +import wherehows.dao.ConnectionPoolProperties; import wherehows.dao.DaoFactory; public class Application extends Controller { - private static final String WHZ_APP_ENV = System.getenv("WHZ_APP_HOME"); - private static final String DB_WHEREHOWS_URL = Play.application().configuration().getString("db.wherehows.url"); - private static final String DB_WHEREHOWS_USERNAME = - Play.application().configuration().getString("db.wherehows.username"); - private static final String DB_WHEREHOWS_PASSWORD = - Play.application().configuration().getString("db.wherehows.password"); + private static final String WHZ_APP_ENV = System.getenv("WHZ_APP_HOME"); + private static final String DB_WHEREHOWS_URL = Play.application().configuration().getString("db.wherehows.url"); + private static final String WHZ_DB_DSCLASSNAME = + Play.application().configuration().getString("hikaricp.dataSourceClassName"); + private static final String DB_WHEREHOWS_USERNAME = + Play.application().configuration().getString("db.wherehows.username"); + private static final String DB_WHEREHOWS_PASSWORD = + Play.application().configuration().getString("db.wherehows.password"); + private static final String DB_WHEREHOWS_DIALECT = Play.application().configuration().getString("hikaricp.dialect"); - public static final EntityManagerFactory entityManagerFactory; + public static final EntityManagerFactory entityManagerFactory; - static { - Map properties = new HashMap<>(); - properties.put("hibernate.connection.provider_class", HikariCPConnectionProvider.class.getName()); - properties.put("hibernate.hikari.dataSourceClassName", "com.mysql.jdbc.jdbc2.optional.MysqlDataSource"); - properties.put("hibernate.hikari.dataSource.url", DB_WHEREHOWS_URL); - properties.put("hibernate.hikari.dataSource.user", DB_WHEREHOWS_USERNAME); - properties.put("hibernate.hikari.dataSource.password", DB_WHEREHOWS_PASSWORD); - properties.put("hibernate.hikari.dataSource.cachePrepStmts", "true"); - properties.put("hibernate.hikari.dataSource.prepStmtCacheSize", "250"); - properties.put("hibernate.hikari.dataSource.prepStmtCacheSqlLimit", "2048"); - properties.put("hibernate.hikari.minimumIdle", "5"); - properties.put("hibernate.hikari.maximumPoolSize", "10"); - properties.put("hibernate.hikari.idleTimeout", "30000"); - properties.put("hibernate.show_sql", "false"); - properties.put("hibernate.dialect", "MySQL5"); - properties.put("hibernate.jdbc.batch_size", "100"); - properties.put("hibernate.order_inserts", "true"); - properties.put("hibernate.order_updates", "true"); - entityManagerFactory = Persistence.createEntityManagerFactory("default", properties); + static { + entityManagerFactory = ConnectionPoolProperties.builder() + .providerClass(HikariCPConnectionProvider.class.getName()) + .dataSourceClassName(WHZ_DB_DSCLASSNAME) + .dataSourceURL(DB_WHEREHOWS_URL) + .dataSourceUser(DB_WHEREHOWS_USERNAME) + .dataSourcePassword(DB_WHEREHOWS_PASSWORD) + .dialect(DB_WHEREHOWS_DIALECT) + .build() + .buildEntityManagerFactory(); + } + + public static final DaoFactory daoFactory = createDaoFactory(); + + private static DaoFactory createDaoFactory() { + try { + String className = Play.application() + .configuration() + .getString("dao.entityManagerFactory.class", DaoFactory.class.getCanonicalName()); + Class factoryClass = Class.forName(className); + Constructor ctor = factoryClass.getConstructor(EntityManagerFactory.class); + return ctor.newInstance(entityManagerFactory); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static Result index() { + return ok("TEST"); + } + + public static Result healthcheck() { + return ok("GOOD"); + } + + public static Result printDeps() { + String libPath = WHZ_APP_ENV + "/lib"; + String commitFile = WHZ_APP_ENV + "/commit"; + String libraries = ""; + String commit = ""; + + if (WHZ_APP_ENV == null) { + return ok("WHZ_APP_HOME environmental variable not defined"); } - public static final DaoFactory daoFactory = createDaoFactory(); - - private static DaoFactory createDaoFactory() { - try { - String className = Play.application().configuration().getString("dao.entityManagerFactory.class", DaoFactory.class.getCanonicalName()); - Class factoryClass = Class.forName(className); - Constructor ctor = factoryClass.getConstructor(EntityManagerFactory.class); - return ctor.newInstance(entityManagerFactory); - } catch (Exception e) { - throw new RuntimeException(e); - } + try { + BufferedReader br = new BufferedReader(new FileReader(commitFile)); + commit = br.readLine(); + } catch (IOException ioe) { + Logger.error("Error while reading commit file. Error message: " + ioe.getMessage()); } - public static Result index() { - return ok("TEST"); + //get all the files from a directory + File directory = new File(libPath); + for (File file : directory.listFiles()) { + if (file.isFile()) { + libraries += file.getName() + "\n"; + } } - public static Result healthcheck() { - return ok("GOOD"); - } - - public static Result printDeps() { - String libPath = WHZ_APP_ENV + "/lib"; - String commitFile = WHZ_APP_ENV + "/commit"; - String libraries = ""; - String commit = ""; - - if (WHZ_APP_ENV == null) { - return ok("WHZ_APP_HOME environmental variable not defined"); - } - - try { - BufferedReader br = new BufferedReader(new FileReader(commitFile)); - commit = br.readLine(); - } catch (IOException ioe) { - Logger.error("Error while reading commit file. Error message: " + - ioe.getMessage()); - } - - //get all the files from a directory - File directory = new File(libPath); - for (File file : directory.listFiles()) { - if (file.isFile()) { - libraries += file.getName() + "\n"; - } - } - - return ok("commit: " + commit + "\n" + libraries); - } + return ok("commit: " + commit + "\n" + libraries); + } } diff --git a/wherehows-backend/application.env b/wherehows-backend/application.env index 663b4f08c0..3b9354a050 100644 --- a/wherehows-backend/application.env +++ b/wherehows-backend/application.env @@ -11,6 +11,10 @@ WHZ_DB_PASSWORD="wherehows" # Fully qualified jdbc url WHZ_DB_URL="jdbc:mysql://localhost/wherehows" +#mysql setup +WHZ_DB_DSCLASSNAME = "com.mysql.jdbc.jdbc2.optional.MysqlDataSource" +WHZ_DB_DIALECT = "org.hibernate.dialect.MySQLInnoDBDialect" + # Directory containing ETL job files WHZ_ETL_JOBS_DIR="/var/tmp/jobs" diff --git a/wherehows-backend/conf/application.conf b/wherehows-backend/conf/application.conf index 3aa54c3b7e..e1fff484de 100644 --- a/wherehows-backend/conf/application.conf +++ b/wherehows-backend/conf/application.conf @@ -13,7 +13,7 @@ play.crypto.secret = ${?WHZ_SECRET} # The application languages # ~~~~~ -play.i18n.langs = [ "en" ] +play.i18n.langs = ["en"] # Play http parser settings # @@ -24,7 +24,7 @@ play.http.parser.maxMemoryBuffer = 10MB # ~~~~~ # Define the Global object class for this application. # Default to Global in the root package. -application.global=shared.Global +application.global = shared.Global # Router # ~~~~~ @@ -49,6 +49,16 @@ db.wherehows.url = ${WHZ_DB_URL} db.wherehows.username = ${WHZ_DB_USERNAME} db.wherehows.password = ${WHZ_DB_PASSWORD} +# Hibernate HIKARICP connection driver name +# HikariCP is an open source JDBC connection pooling library +hikaricp.dataSourceClassName = "com.mysql.jdbc.jdbc2.optional.MysqlDataSource" +hikaricp.dataSourceClassName = ${WHZ_DB_DSCLASSNAME} + +# dialect for DB +# example values for different db: org.hibernate.dialect.MySQLInnoDBDialect, org.hibernate.dialect.H2Dialect +hikaricp.dialect = "org.hibernate.dialect.MySQLInnoDBDialect" +hikaricp.dialect = ${WHZ_DB_DIALECT} + # You can expose this datasource via JNDI if needed (Useful for JPA) # db.default.jndiName=DefaultDS @@ -63,7 +73,7 @@ db.wherehows.password = ${WHZ_DB_PASSWORD} # if does not have this variable, every job will run # if have this varialbe, only the id in this list will be scheduled scheduler.check.interval = 5 -scheduler.check.interval=${?WHZ_SCHEDULER_CHECK_INTERVAL} +scheduler.check.interval = ${?WHZ_SCHEDULER_CHECK_INTERVAL} etl.jobs.dir = ${WHZ_ETL_JOBS_DIR} etl.temp.dir = ${WHZ_ETL_TEMP_DIR} diff --git a/wherehows-dao/src/main/java/wherehows/dao/ConnectionPoolProperties.java b/wherehows-dao/src/main/java/wherehows/dao/ConnectionPoolProperties.java new file mode 100644 index 0000000000..5a96eaf6c4 --- /dev/null +++ b/wherehows-dao/src/main/java/wherehows/dao/ConnectionPoolProperties.java @@ -0,0 +1,64 @@ +/** + * Copyright 2015 LinkedIn Corp. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + */ +package wherehows.dao; + +import java.util.HashMap; +import java.util.Map; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import lombok.Builder; + + +@Builder +public class ConnectionPoolProperties { + private final String providerClass; + private final String dataSourceClassName; + private final String dataSourceURL; + private final String dataSourceUser; + private final String dataSourcePassword; + @Builder.Default + private final String minimumIdle = "10"; + @Builder.Default + private final String maximumPoolSize = "20"; + @Builder.Default + private final String idleTimeout = "30000"; + @Builder.Default + private final String showSQL = "false"; + private final String dialect; + @Builder.Default + private final String jdbcBatchSize = "100"; + @Builder.Default + private final String orderInserts = "true"; + @Builder.Default + private final String orderUpdates = "true"; + + public EntityManagerFactory buildEntityManagerFactory() { + Map properties = new HashMap<>(); + properties.put("hibernate.connection.provider_class", providerClass); + properties.put("hibernate.hikari.dataSourceClassName", dataSourceClassName); + properties.put("hibernate.hikari.dataSource.url", dataSourceURL); + properties.put("hibernate.hikari.dataSource.user", dataSourceUser); + properties.put("hibernate.hikari.dataSource.password", dataSourcePassword); + properties.put("hibernate.hikari.minimumIdle", minimumIdle); + properties.put("hibernate.hikari.maximumPoolSize", maximumPoolSize); + properties.put("hibernate.hikari.idleTimeout", idleTimeout); + properties.put("hibernate.show_sql", showSQL); + properties.put("hibernate.dialect", dialect); + properties.put("hibernate.jdbc.batch_size", jdbcBatchSize); + properties.put("hibernate.order_inserts", orderInserts); + properties.put("hibernate.order_updates", orderUpdates); + + return Persistence.createEntityManagerFactory("default", properties); + } +}