Subversion Repositories SmartDukaan

Rev

Rev 35828 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
21598 ashik.ali 1
package com.spice.profitmandi.dao.config;
2
 
35380 amit 3
import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;
33910 amit.gupta 4
import com.spice.profitmandi.dao.repository.dtr.Mongo;
5
import com.spice.profitmandi.web.config.AppConfig;
34686 amit.gupta 6
import com.zaxxer.hikari.HikariConfig;
7
import com.zaxxer.hikari.HikariDataSource;
35380 amit 8
import org.apache.logging.log4j.LogManager;
9
import org.apache.logging.log4j.Logger;
21598 ashik.ali 10
import org.hibernate.SessionFactory;
11
import org.springframework.context.annotation.Bean;
12
import org.springframework.context.annotation.ComponentScan;
13
import org.springframework.context.annotation.Configuration;
23884 amit.gupta 14
import org.springframework.context.annotation.Primary;
21598 ashik.ali 15
import org.springframework.core.io.Resource;
16
import org.springframework.orm.hibernate5.HibernateTransactionManager;
17
import org.springframework.orm.hibernate5.LocalSessionFactoryBuilder;
18
import org.springframework.transaction.annotation.EnableTransactionManagement;
19
 
35380 amit 20
import javax.annotation.PreDestroy;
33910 amit.gupta 21
import javax.sql.DataSource;
22
import java.io.IOException;
35380 amit 23
import java.sql.Driver;
24
import java.sql.DriverManager;
25
import java.sql.SQLException;
26
import java.util.Enumeration;
33910 amit.gupta 27
import java.util.Properties;
21598 ashik.ali 28
 
29
@Configuration
30
@EnableTransactionManagement
23884 amit.gupta 31
@ComponentScan({ "com.spice.profitmandi.dao.*" })
34686 amit.gupta 32
public class WebDBContextConfigure {
33
 
35380 amit 34
	private static final Logger LOGGER = LogManager.getLogger(WebDBContextConfigure.class);
35
 
21598 ashik.ali 36
	private static final String HIBERNATE_DRIVER_CLASS = "hibernate.driver.class";
37
	private static final String HIBERNATE_URL = "hibernate.url";
38
	private static final String HIBERNATE_USER_NAME = "hibernate.user.name";
39
	private static final String HIBERNATE_PASSWORD = "hibernate.password";
34686 amit.gupta 40
	private static final String HIKARI_MAX_POOL_SIZE = "hikari.maximumPoolSize";
41
	private static final String HIKARI_MIN_IDLE = "hikari.minimumIdle";
42
	private static final String HIKARI_IDLE_TIMEOUT = "hikari.idleTimeout";
43
	private static final String HIKARI_MAX_LIFETIME = "hikari.maxLifetime";
44
	private static final String HIKARI_CONNECTION_TIMEOUT = "hikari.connectionTimeout";
45
 
21598 ashik.ali 46
	private Resource resource = AppConfig.getResource();
47
 
35832 amit 48
	private Properties loadAllProperties() {
21598 ashik.ali 49
		Properties properties = new Properties();
50
		try {
35832 amit 51
			Resource sharedRes = AppConfig.getSharedResource();
52
			if (sharedRes != null && sharedRes.exists()) {
53
				properties.load(sharedRes.getInputStream());
54
			}
21598 ashik.ali 55
			properties.load(resource.getInputStream());
56
		} catch (IOException e) {
35832 amit 57
			LOGGER.error("Failed to load properties", e);
21598 ashik.ali 58
		}
35832 amit 59
		return properties;
60
	}
34686 amit.gupta 61
 
35832 amit 62
	@Bean(name = "dataSource", destroyMethod = "close")
63
	public DataSource dataSource() {
64
		Properties properties = loadAllProperties();
65
 
34686 amit.gupta 66
		HikariConfig config = new HikariConfig();
67
		config.setDriverClassName(properties.getProperty(HIBERNATE_DRIVER_CLASS));
68
		config.setJdbcUrl(properties.getProperty(HIBERNATE_URL));
69
		config.setUsername(properties.getProperty(HIBERNATE_USER_NAME));
70
		config.setPassword(properties.getProperty(HIBERNATE_PASSWORD));
71
		config.setMaximumPoolSize(Integer.parseInt(properties.getProperty(HIKARI_MAX_POOL_SIZE, "20")));
72
		config.setMinimumIdle(Integer.parseInt(properties.getProperty(HIKARI_MIN_IDLE, "2")));
73
		config.setIdleTimeout(Long.parseLong(properties.getProperty(HIKARI_IDLE_TIMEOUT, "30000")));
74
		config.setMaxLifetime(Long.parseLong(properties.getProperty(HIKARI_MAX_LIFETIME, "1800000")));
75
		config.setConnectionTimeout(Long.parseLong(properties.getProperty(HIKARI_CONNECTION_TIMEOUT, "30000")));
35042 amit 76
		config.setLeakDetectionThreshold(30000);
34686 amit.gupta 77
 
78
		return new HikariDataSource(config);
21598 ashik.ali 79
	}
80
 
81
	@Bean
82
	public Properties getHibernateProperties() {
83
		Properties dbProperties = new Properties();
35832 amit 84
		Properties properties = loadAllProperties();
34686 amit.gupta 85
		dbProperties.put("hibernate.dialect", properties.getProperty("hibernate.dialect"));
86
		dbProperties.put("hibernate.show_sql", properties.getProperty("hibernate.show_sql"));
87
		dbProperties.put("hibernate.format_sql", properties.getProperty("hibernate.format_sql"));
88
		dbProperties.put("hibernate.jdbc.batch_size", properties.getProperty("hibernate.jdbc.batch_size"));
35828 amit 89
		dbProperties.put("hibernate.order_inserts", properties.getProperty("hibernate.order_inserts", "true"));
90
		dbProperties.put("hibernate.order_updates", properties.getProperty("hibernate.order_updates", "true"));
21598 ashik.ali 91
		return dbProperties;
92
	}
93
 
23884 amit.gupta 94
	@Primary
21598 ashik.ali 95
	@Bean(name = "sessionFactory")
96
	public SessionFactory getSessionFactory(DataSource dataSource) {
97
		LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
98
		sessionBuilder.addProperties(getHibernateProperties());
99
		sessionBuilder.scanPackages("com.spice.profitmandi.dao.*");
100
		return sessionBuilder.buildSessionFactory();
101
	}
102
 
23884 amit.gupta 103
	@Primary
21598 ashik.ali 104
	@Bean(name = "transactionManager")
105
	public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
34686 amit.gupta 106
		return new HibernateTransactionManager(sessionFactory);
21598 ashik.ali 107
	}
22172 amit.gupta 108
 
35380 amit 109
	@Bean(destroyMethod = "close")
22178 amit.gupta 110
	public Mongo mongoClient(SessionFactory sessionFactory) {
35832 amit 111
		Properties properties = loadAllProperties();
112
		return new Mongo(properties.getProperty("mongo.host"),
24383 amit.gupta 113
				properties.getProperty("content.mongo.host"));
22178 amit.gupta 114
	}
35380 amit 115
 
116
	/**
117
	 * Cleanup method to prevent memory leaks on shutdown.
118
	 * Deregisters JDBC drivers and stops MySQL cleanup thread.
119
	 */
120
	@PreDestroy
121
	public void cleanup() {
122
		LOGGER.info("WebDBContextConfigure cleanup started...");
123
 
124
		// Stop MySQL AbandonedConnectionCleanupThread
125
		try {
126
			AbandonedConnectionCleanupThread.checkedShutdown();
127
			LOGGER.info("MySQL AbandonedConnectionCleanupThread stopped");
128
		} catch (Exception e) {
129
			LOGGER.error("Error stopping MySQL cleanup thread", e);
130
		}
131
 
132
		// Deregister JDBC drivers loaded by this webapp's classloader
133
		ClassLoader cl = Thread.currentThread().getContextClassLoader();
134
		Enumeration<Driver> drivers = DriverManager.getDrivers();
135
		while (drivers.hasMoreElements()) {
136
			Driver driver = drivers.nextElement();
137
			if (driver.getClass().getClassLoader() == cl) {
138
				try {
139
					DriverManager.deregisterDriver(driver);
140
					LOGGER.info("Deregistered JDBC driver: {}", driver);
141
				} catch (SQLException e) {
142
					LOGGER.error("Error deregistering JDBC driver {}", driver, e);
143
				}
144
			}
145
		}
146
 
147
		LOGGER.info("WebDBContextConfigure cleanup completed");
148
	}
34686 amit.gupta 149
}