Guest User

Untitled

a guest
Apr 7th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.28 KB | None | 0 0
  1. import lombok.*;
  2. import lombok.experimental.Delegate;
  3. import lombok.experimental.FieldDefaults;
  4. import lombok.extern.log4j.Log4j2;
  5.  
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.sql.Connection;
  9. import java.sql.DriverManager;
  10. import java.sql.SQLException;
  11. import java.sql.Statement;
  12. import java.util.Properties;
  13. import java.util.Queue;
  14. import java.util.concurrent.ArrayBlockingQueue;
  15. import java.util.concurrent.locks.Lock;
  16. import java.util.concurrent.locks.ReentrantLock;
  17.  
  18. @Log4j2
  19. @FieldDefaults(level = AccessLevel.PRIVATE)
  20. public class ConnectionPool {
  21. static final String PATH_TO_PROPS = "src/main/resources/dbprops.xml";
  22. static final String DEFAULT_URL = "jdbc:sqlite:database.db";
  23. static final int DEFAULT_MAX_CONNECTIONS = 10;
  24. static final String DEFAULT_USER = "root";
  25. static final String DEFAULT_PASSWORD = "root";
  26. static final boolean DEFAULT_IS_TEST = true;
  27. static final ConnectionPool connectionPool;
  28. final Lock lock = new ReentrantLock();
  29. final Queue<Connection> availableConnections;
  30. final Queue<Connection> usedConnections;
  31. @Getter
  32. int maxConnections;
  33. @Getter
  34. String driverUrl;
  35. @Getter
  36. String password;
  37. @Getter
  38. String user;
  39. @Getter
  40. boolean isTest;
  41.  
  42. static {
  43. connectionPool = new ConnectionPool();
  44. }
  45.  
  46. private ConnectionPool() {
  47. Properties properties = new Properties();
  48. try {
  49. FileInputStream fileInputStream = new FileInputStream(PATH_TO_PROPS);
  50. properties.loadFromXML(fileInputStream);
  51. } catch (IOException e) {
  52. log.error("Cannot find config file, use default", e);
  53. driverUrl = DEFAULT_URL;
  54. maxConnections = DEFAULT_MAX_CONNECTIONS;
  55. user = DEFAULT_USER;
  56. password = DEFAULT_PASSWORD;
  57. isTest = DEFAULT_IS_TEST;
  58. } finally {
  59. if (driverUrl == null) {
  60. driverUrl = properties.getProperty("db-url", DEFAULT_URL);
  61. maxConnections = Integer.valueOf(properties.getProperty("max-connections",
  62. String.valueOf(DEFAULT_MAX_CONNECTIONS)));
  63. user = properties.getProperty("user", DEFAULT_USER);
  64. password = properties.getProperty("password", DEFAULT_PASSWORD);
  65. isTest = Boolean.valueOf(properties.getProperty("test", String.valueOf(DEFAULT_IS_TEST)));
  66. }
  67. }
  68. availableConnections = new ArrayBlockingQueue<>(maxConnections);
  69. usedConnections = new ArrayBlockingQueue<>(maxConnections);
  70. }
  71.  
  72. public static ConnectionPool getConnectionPool() {
  73. return connectionPool;
  74. }
  75.  
  76. public Connection getConnection() {
  77. // 1:
  78. // May be this is redundant, but I think that it's semantically correct.
  79. // I just want let the others see only consistent object.
  80. lock.lock();
  81. if (availableConnections.size() + usedConnections.size() < maxConnections && availableConnections.size() == 0) {
  82. try {
  83. PooledConnection pooledConnection = new PooledConnection(DriverManager.getConnection(driverUrl, user, password));
  84. availableConnections.offer(pooledConnection);
  85. } catch (SQLException e) {
  86. log.error("Connection was not created.", e);
  87. }
  88. }
  89. Connection connection = availableConnections.poll();
  90. if (connection != null) {
  91. usedConnections.offer(connection);
  92. }
  93. lock.unlock();
  94. return connection;
  95. }
  96.  
  97. public int connectionsAvailable() {
  98. return availableConnections.size();
  99. }
  100.  
  101. @AllArgsConstructor
  102. @FieldDefaults(level = AccessLevel.PRIVATE)
  103. @EqualsAndHashCode
  104. private class PooledConnection implements Connection {
  105.  
  106. @Delegate(excludes = {AutoCloseable.class})
  107. Connection connection;
  108.  
  109. @Override
  110. public void close() {
  111. try {
  112. // Goto 1;
  113. lock.lock();
  114. usedConnections.remove(this);
  115. // You know da way.
  116. availableConnections.offer(this);
  117. lock.unlock();
  118. } catch (SQLException e) {
  119. log.error("Connection was not created.", e);
  120. }
  121. log.info("Connection: [" + connection + "] were returned.");
  122. }
  123. }
  124. }
Add Comment
Please, Sign In to add comment