Java - Вопрос управления памятью / соединениями с БД - PullRequest
0 голосов
/ 20 января 2011

Я пишу пул соединений с БД на Java.Это просто класс, который содержит кучу соединений и выдает их.

Нужен ли какой-то метод деструктора, чтобы соединения с БД закрывались, когда экземпляр моего класса выходит из области видимости?*

Редактировать: Это только для целей обучения .Я бы определенно использовал надежный пул соединений с открытым исходным кодом в производственном использовании.Я действительно просто хочу понять последствия управления памятью.

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Просто с моей головы скажи, что у тебя есть предмет, твой ключ.Реализуйте уникальный ключ для вашего ключа.hashCode() - хорошее место для начала.Когда вы создаете свой объект, поместите объект в WeakReference и свяжите его с ReferenceQueue.Теперь используйте хэш-код в качестве ключа для Map<int, Connection>.Когда ваш объект выходит из области видимости, перейдите к ReferenceQueue, чтобы получить объект, используйте hashCode, чтобы получить Connection из Map и закрыть его.

См. Учебник по ссылкам здесь

2 голосов
/ 20 января 2011

Если вы пытаетесь сделать это в учебных целях, то то, что вы делаете, хорошо. Загрузите исходный код для одной из нижеупомянутых библиотек и просмотрите их код. Это поможет вам понять, как они справляются с жизненным циклом соединения.

Но если вы хотите использовать его как часть производственного приложения, я настоятельно рекомендую использовать один из следующих вариантов

  1. BoneCP
  2. c3p0
1 голос
/ 20 января 2011

Правильный способ сделать это - обернуть экземпляр соединения в свой собственный класс, который реализует java.sql.Connection, а затем выдать это «соединение» через пул. Вы будете вынуждены реализовать все методы, которые вы можете с радостью передать «реальной» связи. За исключением одного - close (). В этом методе вы должны вернуть соединение с пулом, не закрывая его.

Вы не можете вернуть объект в пул, просто выпустив его из области видимости. Вы можете поместить что-то в finalize (), который возвращает это в пул, но делать это опасно. Finalize () запускается только один раз для любого объекта, поэтому, если вы поместите туда что-нибудь, чтобы «поймать» объект и не дать ему быть gc'd, finalize () никогда не будет вызываться для него снова.

...