2011-07-25 14 views
6

Projemde, her işlem için varlık yöneticisini kapatmayı unuttum. Bir süre sonra, mysql sunucusuna aşırı bağlantılar nedeniyle istisna aldım. Bu, her bir varlık yöneticisinin bağlantıyı kurduğu anlamına mı geliyor? Bağlantıyı kapatmayı unuttuğumuzda ne olacak? Sadece tek bir varlık yöneticisi fabrikası kullandım.Bir varlık yöneticisi veritabanına bir bağlantı oluşturur mu?

cevap

9

Uygulama tarafından yönetilen bir varlık yöneticisi kullandığınızı varsayarsak, varlık yöneticisini başlatmak ve kapatmak sizin sorumluluğunuzdadır. Diğer taraftan, eğer varlık yöneticisini oturum çekirdeklerinize (veya yönetilen sınıflara) enjekte etmek için konteynere güveniyorsanız, kapsayıcı kuruluşun kapalı olmasını sağlamaktan sorumludur. Genelde, veritabanı yöneticisi, bağlantıya veritabanı oluşturmaktan sorumlu değildir. Bunun yerine, persistence.xml'da tanımlanan bir bağlantı havuzu kullanır. Bu hem JTA varlık yöneticileri hem de kaynak-yerel varlık yöneticileri için geçerlidir; JTA varlık yöneticileri, uygulama sunucusu ortamı tarafından sağlanan bir JTA veri kaynağına güvenirken, kaynak yerel varlık yöneticileri kendi havuzlarını oluşturur ve yönetir.

Varlık yöneticilerini kapatmazsanız ve yeni örnekler oluşturmaya devam ederseniz, JTA veri kaynağındaki bağlantıları (JTA varlık yöneticileri için) tüketmeniz veya sunucu tanımlı bir sınıra ulaşmanız mümkündür. İstemci bağlantıları (hem JTA hem de kaynak yerel varlık yöneticileri için). Her bir veritabanı örneği, belirli sayıda bağlantıdan fazlasını kabul edecek şekilde yapılandırılacaktır. Tüm istemciler tarafından kurulan bağlantı sayısı bu sınırı aşarsa, sunucu yalnızca ekleme bağlantılarını bırakır. Bir havuzdan (JTA varlık yöneticileri için) ek bağlantılar için istekte bulunan veya yeni havuzlar (kaynak yerel varlık yöneticileri için) oluşturmak isteyen varlık yöneticisi örneklerini açarsanız, havuzun kendisinin de tükenmiş olması çok olasıdır. birçok bağlantı açılmış olurdu.

Bağlantıları doğrudan kapatamadığınızdan veya bağlantı havuzlarını uygulamanızdan yeniden boyutlandıramayacağınız için, artık gerekmediğinde varlık yöneticisi örneklerini kapatmanız gerektiği oldukça açıktır; Bu, varlık yöneticisi için kurulan bağlantıları otomatik olarak serbest bırakır.

Ayrıca, bir sebepten dolayı kaynak yerel varlık yöneticilerini kullanıyorsanız, her varlık yöneticisi örneği için iyi ayarlanmış ve yeterli boyutta bir bağlantı havuzunu kullanmak akıllıca olacaktır. Bir JTA varlık yöneticisi kullanıyorsanız, iyi ayarlanmış ve yeterli boyutta bir bağlantı havuzunun desteklediği kapsayıcı tarafından enjekte edilmiş varlık yöneticileri ve bir JTA veri kaynağı kullanmayı düşünün.

3

Her durumda - EntityManager'ı açık bir şekilde açarsanız (bunu EMFactory'den edinin), sonra kapatmanız gerekir. Bağlantının olup olmadığı (durumunuz böyle görünüyor) ya da değil JPA sağlayıcısıyla ilişkili ayarlara bağlıdır. Projemizde, EM her sorgu için bağlantıyı açar ve hemen geri verir (kapanır). Ancak başka seçenekler de var: bağlantıyı veya işlem yaşam döngüsünü takip eden bağlantıyı koruyun. Örneğin, settings for OpenJPA. EM, sorgu/işlem için bağlantıyı açtıysa, sorunu vurmayacağınızdan daha fazlasını söyleyebilirim. Görünüşe göre EM'iniz bağlantıyı alıp tutar.

Her durumda, oluşturduysanız EM'yi kapatmalısınız. En iyi uygulama, eğer mümkünse, aynı yöntemde yapmaktır, bu yüzden doğruluğu gözden geçirmek ve sonunda bloke etmek kolaydır.

İlgili konular