Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > данные из DataSource


Автор: PHelen 30.3.2008, 20:37
Привет всем. есть код

Код

public static TreeMap    c_PooledDataSource = null ;
... 
javax.naming.InitialContext ic ;
DataSource ds;           
String key ;                   

ic = new javax.naming.InitialContext();    
Enumeration l_enum = ic.list("jdbc");          
while( l_enum.hasMoreElements() )
{
  javax.naming.NameClassPair l_par_name = (javax.naming.NameClassPair)l_enum.nextElement();
  if ( l_par_name.getClassName().equals("com.evermind.sql.OrionCMTDataSource") )
  {
    key = l_par_name.getName();
    ds = (DataSource) ic.lookup( "jdbc/" + key );         
    c_PooledDataSource.put(key,ds); 
  } 
}



Использую JDeveloper с oc4j. В oc4j из data-source.xml заносится информация о пулах адресов:

Код

<data-source name="mi" class="..." location="..." ... username="..." ... url="..." min-connections="1" max-connections="30"/>   
...
<data-source name="or" class="..." location="..." ... username="..." ... url="..." min-connections="1" max-connections="30"/>


Как мне кроме имени получить еще url и username? Как я поняла они храняться в DataSource (ds).

Есть вариант с использованием metadata: 
Код

 DatabaseMetaData dbd = conn.getMetaData();
 String su = " url = " +  dbd.getURL() + " username = " + dbd.getUserName() +"\n"; 


Но это получение данных (url, username) только у успешного соединения, а надо бы вытащить данные обо всех. 

Подскажите, пожалуйста, как это можно сделать?

Автор: mbasil 31.3.2008, 12:29
Код

((OracleDataSource)ds).getURL();
((OracleDataSource)ds).getUser();


Кстати DatabaseMetaData "жрет" память со страшной силой и при нормальной работе этот объект лучше не создавать.

Автор: PHelen 31.3.2008, 16:41
com.evermind.sql.OrionCMTDataSource надо бы оставить

но 
Код

java.lang.ClassCastException: com.evermind.sql.OrionCMTDataSource


DataSource и OracleDataSource насколько я поняла "несовместимы".
Как быть?

Автор: mbasil 1.4.2008, 10:44
Извините - я не очень внимательно просмотрел текст и решил, что Вы используете источник данных непосредственно  из драйвера Oracle. Поскольку Вам нужен именно источник данных, реализованный как com.evermind.sql.OrionCMTDataSource (судя по названию это пул подключений, унаследованный Oracle от сервера Orion), так и приводите ссылку к нему, а затем выяснив, какие у этого специфического источника имеются методы для получения нужной информации, вызывайте их.

Если документация на этот источник отсутствует я бы "выковырял" класс и декомпилировал его, например jad'ом.

Какую реализацию источника данных использовать (пула подключений) это дело технического решения.

Просто в коде Вы используете только com.evermind.sql.OrionCMTDataSourceЮ и это Ваше решение: 
Код

if ( l_par_name.getClassName().equals("com.evermind.sql.OrionCMTDataSource") )
  {
    key = l_par_name.getName();
    ds = (DataSource) ic.lookup( "jdbc/" + key );
    OrionCMTDataSource ds2 = ((OrionCMTDataSource)ds;
    String s ds2.<method()>;

    c_PooledDataSource.put( key,ds ); 
  } 


Автор: mbasil 1.4.2008, 12:09
Кстати здесь, кажется можно было бы обойтись без Reflection, например так:
Код

while( l_enum.hasMoreElements() ) {

  javax.naming.NameClassPair l_par_name = (javax.naming.NameClassPair)l_enum.nextElement();
  key = l_par_name.getName();
  Object o = ic.lookup( "jdbc/" + key ); 
  if ( o instanceof OrionCMTDataSource ) {
    OrionCMTDataSource ds = (OrionCMTDataSource)o;
    . . .     
    c_PooledDataSource.put(key,ds); 
  } 
}

Привожу этот пример, чтобы было более понятно, чтоя имел ввиду ранее. 

Автор: PHelen 1.4.2008, 16:16
Спасибо за (OrionCMTDataSource)ds;
Буду пытаться вытащить URL 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)