DataSourceManager.java 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package com.gitee.gen.gen;
  2. import org.apache.commons.dbcp2.BasicDataSourceFactory;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import javax.sql.DataSource;
  6. import java.sql.Connection;
  7. import java.sql.SQLException;
  8. import java.util.Map;
  9. import java.util.Properties;
  10. import java.util.concurrent.ConcurrentHashMap;
  11. /**
  12. * @author tanghc
  13. */
  14. public class DataSourceManager {
  15. private static final Logger logger = LoggerFactory.getLogger(DataSourceManager.class);
  16. private static final Map<String, DataSource> DATA_SOURCE_MAP = new ConcurrentHashMap<>(16);
  17. private static final ThreadLocal<Connection> CONNECTION_LOCAL = new ThreadLocal<>();
  18. public static Connection getConnection(GeneratorConfig generatorConfig) {
  19. Connection connection = CONNECTION_LOCAL.get();
  20. if (connection == null) {
  21. try {
  22. connection = getDataSource(generatorConfig).getConnection();
  23. CONNECTION_LOCAL.set(connection);
  24. } catch (SQLException e) {
  25. logger.error("获取Connection失败, jdbcUrl:{}", generatorConfig.getJdbcUrl(), e);
  26. throw new RuntimeException("获取Connection失败", e);
  27. }
  28. }
  29. return connection;
  30. }
  31. public static void closeConnection() {
  32. Connection connection = CONNECTION_LOCAL.get();
  33. if (connection != null) {
  34. try {
  35. connection.close();
  36. } catch (SQLException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. CONNECTION_LOCAL.remove();
  41. }
  42. public static DataSource getDataSource(GeneratorConfig generatorConfig) {
  43. String jdbcUrl = generatorConfig.getJdbcUrl();
  44. DataSource dataSource = DATA_SOURCE_MAP.computeIfAbsent(jdbcUrl, key -> {
  45. Properties properties = new Properties();
  46. properties.put("driverClassName", generatorConfig.getDriverClass());
  47. properties.put("url", generatorConfig.getJdbcUrl());
  48. properties.put("username", generatorConfig.getUsername());
  49. properties.put("password", generatorConfig.getPassword());
  50. // 初始连接数
  51. properties.put("initialSize", 1);
  52. // 最大活跃数
  53. properties.put("maxTotal", 30);
  54. properties.put("minIdle", 5);
  55. properties.put("maxIdle", 10);
  56. // 最长等待时间(毫秒)
  57. properties.put("maxWaitMillis", 1000);
  58. // 程序中的连接不使用后是否被连接池回收
  59. properties.put("removeAbandonedOnMaintenance", true);
  60. properties.put("removeAbandonedOnBorrow", true);
  61. // 连接在所指定的秒数内未使用才会被删除(秒)
  62. properties.put("removeAbandonedTimeout", 5);
  63. try {
  64. return BasicDataSourceFactory.createDataSource(properties);
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. return null;
  68. }
  69. });
  70. if (dataSource == null) {
  71. throw new RuntimeException("连接数据库失败");
  72. }
  73. return dataSource;
  74. }
  75. }