Evgenii Legotckoi
26 вересня 2018 р. 17:53

Приклад - пул об'єктів в Java

Приклад шаблону проектування Об'єктний пул мовою програмування Java.


  1. // ObjectPool Class
  2.  
  3. public abstract class ObjectPool<T> {
  4. private long expirationTime;
  5.  
  6. private Hashtable<T, Long> locked, unlocked;
  7.  
  8. public ObjectPool() {
  9. expirationTime = 30000; // 30 seconds
  10. locked = new Hashtable<T, Long>();
  11. unlocked = new Hashtable<T, Long>();
  12. }
  13.  
  14. protected abstract T create();
  15.  
  16. public abstract boolean validate(T o);
  17.  
  18. public abstract void expire(T o);
  19.  
  20. public synchronized T checkOut() {
  21. long now = System.currentTimeMillis();
  22. T t;
  23. if (unlocked.size() > 0) {
  24. Enumeration<T> e = unlocked.keys();
  25. while (e.hasMoreElements()) {
  26. t = e.nextElement();
  27. if ((now - unlocked.get(t)) > expirationTime) {
  28. // object has expired
  29. unlocked.remove(t);
  30. expire(t);
  31. t = null;
  32. } else {
  33. if (validate(t)) {
  34. unlocked.remove(t);
  35. locked.put(t, now);
  36. return (t);
  37. } else {
  38. // object failed validation
  39. unlocked.remove(t);
  40. expire(t);
  41. t = null;
  42. }
  43. }
  44. }
  45. }
  46. // no objects available, create a new one
  47. t = create();
  48. locked.put(t, now);
  49. return (t);
  50. }
  51.  
  52. public synchronized void checkIn(T t) {
  53. locked.remove(t);
  54. unlocked.put(t, System.currentTimeMillis());
  55. }
  56. }
  57.  
  58. //The three remaining methods are abstract
  59. //and therefore must be implemented by the subclass
  60.  
  61. public class JDBCConnectionPool extends ObjectPool<Connection> {
  62.  
  63. private String dsn, usr, pwd;
  64.  
  65. public JDBCConnectionPool(String driver, String dsn, String usr, String pwd) {
  66. super();
  67. try {
  68. Class.forName(driver).newInstance();
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. }
  72. this.dsn = dsn;
  73. this.usr = usr;
  74. this.pwd = pwd;
  75. }
  76.  
  77. @Override
  78. protected Connection create() {
  79. try {
  80. return (DriverManager.getConnection(dsn, usr, pwd));
  81. } catch (SQLException e) {
  82. e.printStackTrace();
  83. return (null);
  84. }
  85. }
  86.  
  87. @Override
  88. public void expire(Connection o) {
  89. try {
  90. ((Connection) o).close();
  91. } catch (SQLException e) {
  92. e.printStackTrace();
  93. }
  94. }
  95.  
  96. @Override
  97. public boolean validate(Connection o) {
  98. try {
  99. return (!((Connection) o).isClosed());
  100. } catch (SQLException e) {
  101. e.printStackTrace();
  102. return (false);
  103. }
  104. }
  105. }

JDBCConnectionPool дозволить застосунку запозичувати та повертати з'єднання з базою даних:

  1. public class Main {
  2. public static void main(String args[]) {
  3. // Do something...
  4. ...
  5.  
  6. // Create the ConnectionPool:
  7. JDBCConnectionPool pool = new JDBCConnectionPool(
  8. "org.hsqldb.jdbcDriver", "jdbc:hsqldb://localhost/mydb",
  9. "sa", "secret");
  10.  
  11. // Get a connection:
  12. Connection con = pool.checkOut();
  13.  
  14. // Use the connection
  15. ...
  16.  
  17. // Return the connection:
  18. pool.checkIn(con);
  19.  
  20. }
  21. }

Вам це подобається? Поділіться в соціальних мережах!

МХ
  • 26 вересня 2018 р. 19:24

аываыв

pasagir
  • 27 вересня 2018 р. 15:01

Полностью согласен с комментарием выше

Evgenii Legotckoi
  • 27 вересня 2018 р. 15:24

абыр валг?

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…