2016-03-30 46 views
0

İşte c3p0 yapılandırması için benim kodudur dağıtımdan sonra boş getirmek ... uygulama sunucusu başladı edilirken, i dbDef gelen datasources (db tanımları tablo)C3P0 ComboPooledDataSource.getConnection yöntemi

SessionFactory sessionFactoryByServer; 
Connection jdbcConnectionC3P0; 
List<Map<String, Object>> connectionSourceList; // object combopooleddatasource 
@PostConstruct 
public void init() { 
    List <DBDef> dbDefs = new ArrayList<DBDef>(); 
    try { 
     dbDefs = getAllServerIpAddresses(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    connectionSourceList = new ArrayList<Map<String, Object>>(); 
    for (int i = 0; i < dbDefs.size(); i++) { 
     try { 
      Map<String, Object> cpdsMap = new HashMap<String, Object>(); 
      ComboPooledDataSource cpds = new ComboPooledDataSource(); 
      cpds.setDebugUnreturnedConnectionStackTraces(false); 
      cpds.setDriverClass(dbDefs.get(i).getDriver()); 
      cpds.setJdbcUrl(dbDefs.get(i).getConnectionURL()); 
      cpds.setUser(dbDefs.get(i).getUserName()); 
      cpds.setPassword(dbDefs.get(i).getPassword()); 
      cpds.setDataSourceName(dbDefs.get(i).getIpAddress()); 
      cpds.setAcquireIncrement(5); 
      cpds.setIdleConnectionTestPeriod(1800); 
      cpds.setMinPoolSize(10); 
      cpds.setAcquireRetryAttempts(1); 
      cpds.setPreferredTestQuery("SELECT 1"); 
      cpds.setMaxPoolSize(50); 
      Configuration cfg = new Configuration(); 
      cfg.configure(dbDefs.get(i).getHbmCfgXmlPath()); 
      cfg.setProperty("connection.provider_class", dbDefs.get(i).getConnectionProvideClass()) 
       .setProperty("hibernate.c3p0.acquire_increment", dbDefs.get(i).getAcquireIncrement()) 
       .setProperty("hibernate.c3p0.max_size", dbDefs.get(i).getMaxSize()) 
       .setProperty("hibernate.c3p0.min_size", dbDefs.get(i).getMinSize()) 
       .setProperty("hibernate.c3p0.timeout", dbDefs.get(i).getTimeout()) 
       .setProperty("hibernate.c3p0.max_statements", dbDefs.get(i).getMaxStatements()) 
       .setProperty("hibernate.c3p0.idle_test_period", dbDefs.get(i).getIdleTestPeriod()) 
       .setProperty("hibernate.show_sql", "true");  
      ServiceRegistryBuilder ssrb = new ServiceRegistryBuilder().applySettings(cfg.getProperties()); 
      SessionFactory sessionFactory = cfg.buildSessionFactory(ssrb.buildServiceRegistry()); 
      cpdsMap.put("serverIp", dbDefs.get(i).getIpAddress()); 
      cpdsMap.put("dataSource", cpds); 
      cpdsMap.put("sessionFactory", sessionFactory);    
     } catch (PropertyVetoException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
başlatılıyor am

c3p0 veri kaynaklarını List<Map<String, Object>> connectionSourceList;'a başlattıktan sonra, sırayla 3 veri tabanından bir miktar veri almak istediğimde, bu listede üçüncü kısım bence özniteliklerinin bazılarını unutur. Burada ortaya çıkan sorun.

private SessionFactory retCurSessionFactory(String ipAddress) throws SQLException { 
    SessionFactory currentSessionFactory = null; 
    for (Map<String, Object> cpdsMap : connectionSourceList) { 
      sessionFactoryByServer = (SessionFactory)cpdsMap.get("sessionFactory"); 
      jdbcConnectionC3P0 = ((ComboPooledDataSource)cpdsMap.get("dataSource")).getConnection();//getConnection brings null here, but only in app server not in my local machine. 
      currentSessionFactory = (SessionFactory)cpdsMap.get("sessionFactory"); 
     } 
    } 
    return currentSessionFactory; 
} 

getConnection yöntemi, program uygulama sunucusunda çalışırken bu yöntemi çağırdığında null değerini döndürür. Tomcat, geliştirme yasasıyla aynıdır (kopyala yapıştırılan) benim yerim ve uygulama sunucusu arasındaki internet bağlantısı bazen milisaniye için kesilir ve bunu bulmadan önce getConnection boş değerin altında bu stacktrace'i alır ...

03-28 19:00:21 INFO AbstractPoolBackedDataSource: 2016-03-28 19:00:22 WARN BasicResourcePool: org.postgresql.util.PSQLException: FATAL: "xx.xxx.xx.x" ana bilgisayarı için pg_hba.conf girişi yok kullanıcı "kullanıcı adı ", veritabanı "xxxx" SSL kapalı

VE

java.sql.SQLException: Bağlantılar altta yatan veritabanından alınamadı!

DÜZENLEME: Hba yapılandırma içeriği eklenir.

+1

http://stackoverflow.com/search?q=[postgresql]+no+pg_hba.conf+entry+for+host –

+0

Cevabınız için teşekkürler. ama işaret ettiğin bu cevaplara çoktan baktım. Müşterimden bahsettiğim gibi postgre sunucuları bir görüntü dosyası tarafından ayarlanıyor. öyleyse neden diğer bağlantılardan veri alırken sorunum yok. kurulumları aynıdır. – comitatenses

+0

"* no pg_hba.conf entry *" hata mesajı oldukça açık. Gönderiniz (** değil ** "* postgre *" btw) yapılandırması, uygulama sunucunuzdan bir bağlantıya izin vermiyor. Sorunuzu [değiştir] ve bize 'pg_hga.conf'un ** tam ** içeriğini göster, aksi halde bu soruya cevap verilemez. –

cevap

0

DbDef nesnesinden ComboPooledDataSource nesnesini başlatırken bir hata buldum. Bağlantı özelliklerini aldığım veritabanında yeni bir satır oluşturdum. DB satırında tanımda bir boşluk char olmalıdır. Yani bu kod, dinamik olarak db bağlantılarını başlatmak için iyi çalışıyor.