2012-12-05 12 views
5

Czy możliwe jest programistyczne powiązanie źródła danych z 6 JNDI Tomcat?Powiąż źródło danych JNDI w tomcat?

Chcę utworzyć źródło danych w locie, a następnie udostępnić je poprzez JNDI (na przykład dla ColdFusion).

To jest to, co mam:

public void bindToConext(DataSource dataSource) throws NamingException, SQLException { 
    Context initContext = new InitialContext(); 
    Context envContext = (Context)initContext.lookup("java:/comp/env"); 
    envContext.bind("jdbc/mydatasource", dataSource); 
} 

Ale ja otrzymuję ten wyjątek:

javax.naming.OperationNotSupportedException: Context is read only 

Czy istnieje obejść?

+0

Możesz opublikować zasób mindas

+0

@mindas Witaj, nie mam w tym momencie, ponieważ niczego tam nie wstawię (wszystko zostanie utworzone dynamicznie). Czy powinienem stworzyć fałszywy? – OscarRyz

+0

Chciałbym utworzyć element zastępczy, a następnie zmodyfikować wpisy w nim. W obu przypadkach brzmi to jak dobra praktyka. Daj nam znać, jeśli to pomogło. – mindas

Odpowiedz

3

Cóż, nie było to możliwe, ponieważ kontekst tomcat staje się tylko do odczytu po starcie.

To, co zrobiliśmy, to użycie SimpleJNDI, który jest w kontekście pamięci (bardziej jak uwielbiony HashMap) i który działał dla nas.

Potrzebuje plik jndi.properties, który musi być w ścieżce klasy i gdzie można określić katalog, w którym szukać środków i wstępną fabryki kontekstowe

java.naming.factory.initial=org.osjava.sj.SimpleContextFactory 
org.osjava.sj.root=some/relative/path 
org.osjava.jndi.delimiter=/ 
org.osjava.sj.jndi.shared=true 

Aby wykonać wiązanie z ColdFusion najpierw tworzymy dane źródło programowo, a następnie powiązać go z kontekstu:

DataSource ds = ... 
Context c = new InitialContext(); 
c.bind("jdbc/my/blah/"+var , ds); 
... 

następnie za pomocą API CF administratora tworzymy źródło danych typu CF z JNDI tylko za pomocą jndiname

1

Kontekst roboczy Tomcat to Java: comp/env. Ten kontekst jest tylko do odczytu. Ale możesz tworzyć własne konteksty za pomocą implementacji JNDI Tomcat, o ile nie będziesz mieć dostępu do "java: comp/env".

Context ctx = new InitialContext() 
ctx.createSubcontext("any_name").createSubcontext("any_sub_name"); 
ctx.bind("any_name/any_sub_name/myDataSource", myDataSource); 

Przez domyślnego kontekstu Tomcat są wspólne, więc DataSource jest odzyskiwane z dowolnego miejsca w swojej aplikacji w ten sposób:

Context ctx = new InitialContext() 
DataSource ds = (DataSource)ctx.lookup("any_name/any_sub_name/myDataSource"); 
Powiązane problemy