2010-12-09 11 views
5

Her veritabanı satırı ekleme/güncelleştirme için tek tek web hizmeti çağrıları kullanan bir Java J2EE uygulamasına sahibiz. Bu çok yavaş olduğu ortaya çıktı. Beni "çabucak" düzeltmeye getirdiler. Tüm web servis çağrılarını sade JDBC'ye dönüştürmeyi planlıyorum. Bunu yapmak için havuzdan bir JDBC bağlantısı almalı ve sonra bunu birden çok farklı yöntemde kullanmalıyım. Hepsini tek bir veritabanı işleminde birleştirmek için birden fazla DAO'da aynı JDBC bağlantısını kullanmam gerekiyor. JDBC bağlantısına gereksinim duyan her bir DAO'yu açıkça iletebilirim, ancak bu bana çok sayıda yöntem imzalarını ve bir çok birim testini ("hızlı" parçaya karşı) geçen bir sürü testin değiştirilmesini gerektirebilirdi.İlkbahar/JPA/Hazırda Bekletme özelliğini kullanmadan JDBC bağlantısından nasıl geçilir

JDBC bağlantısını bir yere koymanın iyi bir yolunu bulmaya çalışıyorum ve daha sonra onu her yere açıkça aktarmak zorunda kalmadan onu gereksinim duyulan yöntemlerle yakaladım. Destek ekibinin bu teknolojileri desteklememesi nedeniyle, bu projede Spring, JPA veya Hibernate kullanamıyoruz. JDBC bağlantısını bir EJB'ye koyabilirim, ama ne kadar güvenilir olacağından emin değilim. Her kullanıcı için veritabanı bağlantılarını yönetmek için özel bir Singleton oluşturabilirim (oturum?), Ancak iplik güvenliği konusunda dikkatli olmalıyım. Daha önce böyle bir şey yapmaya çalıştıysa, bazı tavsiyelerde bulunmak isterim.

cevap

1

Bir ThreadLocal kullanabilirsiniz. Giriş noktası kurmak ve DAOs Pretty çirkin

class ConnectionUtil { 
    public static final ThreadLocal<Connection> connection = new ThreadLocal<Connection>(); 
} 

public Return method(Args arg) { 
    ConnectionUtil.connection.set(newConnection()); 
    try { 
     ... 
    } finally { 
     ConnectionUtil.connection.remove(); 
    } 
} 

daha var, ama bu senin patronun istediği gibi görünüyor.

+0

Bu bizim için gerçekten işe yarayabilir. Bu şekilde yapan herhangi bir önemli performans sorunu var mı? – Shane

+0

ThreadLocal's, bir süredir Sun'ın performans iyileştirme hedefi olmuştur. DB işlemleriyle karşılaştırıldığında, bir yuvarlama hatası olur. – sblundy

1

Bunu daha önce yaptık (5 yıl önce IBM WebSphere üzerinde). Kendi havuzunu yazdık ve jdbc bağlantılarını bir hashtable içinde sessionID ile sakladık. Tek tuzak seanstaki bağlantıyı kapatmak ve havuza geri döndürmek (bunu bir sessionlistener ile yaptık) oldu. Bir kullanıcı oturumu sadece bir jdbc bağlantısına bağlanırsa, iplik güvenliği devralınır. Böylece, tekil yaklaşımı kesinlikle işe yarıyor. Performans kazancımız berbattı.

2

Apache Commons DBCP'u kullanın. Apache'den Bağlantı Havuzu projesi ve birçok motorda dahili olarak kullanılan şey.

+1

Apache Commons DBCP'nin bir bağlantı havuzunu korumaya yardımcı olduğunu anlıyorum, ancak SAME bağlantısını elde edebilmek için her bir DAO ekleme/güncelleştirme/silme yöntemine ihtiyacım var. DBCP buna yardımcı olabilir mi? Bir yerde bir örnek var mı? Birkaç Google araştırdım ve hiçbir şey bulamadım. – Shane

0

Ayrıca, buradaki DAO'lar için yaptığım şey, bağlantıyı yöntem imzasında değil, Yapıcı'da geçirmektir. Daha sonra, onu kapatmaktan sorumlu olan asıl sorumluluğu oluşturan nesneyi tutuyorum.

İlgili konular