原文:http://aguu125.iteye.com/blog/1694313?
?https://blog.csdn.net/bigtree_3721/article/details/44900325-------JNDI之java:comp/env
was配置數據源和tomcat是不同的。tomcat只需要配置tomcat 的service.xml或者content.xml,然后 WEB程序就不需要配置了。但是was不同.was 除了在控制臺配置數據源后,還需要在web.xml 和WEB-IBN.XML中配置
?
websphere 下獲取jndi,有兩種方式:java:comp/env/cas與jdbc/cas。?A.lookup("java:comp/env/cas")與lockup("jdbc/cas")在websphere中都可以使用。兩者的差別在于,java:comp/env/cas是websphere建議使用的方式 。
??? 如果你當前的線程屬于websphere的線程,建議使用java:comp/env/cas的方式,否則was的控制臺將報出警告。?
? ? 在web程序中,要實現通過java:comp/env/cas的方式來獲得jndi必須在web.xm和ibm-web-bnd.xmi文件里分別添加?
?web.xml:?
?
- <resource-ref id="ResourceRef_1129470735234">
- <res-ref-name>cas_ase</res-ref-name>
- <res-type>java.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- <res-sharing-scope>Shareable</res-sharing-scope>
- </resource-ref>
ibm-web-bnd.xmi:?
?
?
- <resRefBindings xmi:id="ResourceRefBinding_1129470735234"
- jndiName="jdbc/cas_ase">
- <bindingResourceRef href="WEB-INF/web.xml#ResourceRef_1129470735234" />
- </resRefBindings>
?以上兩段配置的意思是告訴web容器的上下文環境,將應用映射到的jndi資源。然后就可以通過lookup(“java:comp/env/cas/jdbc/cas_ase”)名來獲得數據源。?
???? 然而,如果你當前執行的線程不在was的容器內,比如說你通過web容器的線程新起了一個子線程,那么該線程將不在容器的上下文內,通過lookup(“java:comp/env/cas/jdbc/cas_ase”)名來獲得數據源?
???? 將報錯,這個時候你只能使用通用的獲取jndi資源的方式,就是通過lookup(“jdbc/cas”)來實現。“jdbc/cas”為你在was的資源設定的jndi名
?
?
java代碼:?
?
- package com;
- import java.sql.Connection;
- import java.util.Hashtable;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- import javax.naming.NamingException;
- import javax.sql.DataSource;
- public class conn {
- public static void main(String[] args) throws Exception {
- InitialContext initialContext = getInitialContext();
- javax.sql.DataSource ds = (DataSource) initialContext.lookup("jdbc/cas_ase");
- Connection cn = ds.getConnection();
- if (cn != null){
- System.out.println("Connection ok");
- }
- }
- /* 因為此類不在Websphere服務器內部運行,所以需要配置環境變量,否則是可以省略的 */
- public static InitialContext getInitialContext() throws NamingException {
- Hashtable env = new Hashtable();
- env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
- env.put(Context.PROVIDER_URL, "iiop://localhost:2809"); // iiop是協議
- InitialContext context = new InitialContext(env);
- return context;
- }
- }
關于JNDI可以看:http://blog.csdn.net/lan861698789/article/details/26402935?
?
?
關于web.xml中參數的解釋:
?
resource-ref元素用于指定對外部資源的servlet引用的聲明。<!ELEMENT resource-ref (description?, res-ref-name,
- res-type, res-auth, res-sharing-scope?)>
- <!ELEMENT description (#PCDATA)>
- <!ELEMENT res-ref-name (#PCDATA)>
- <!ELEMENT res-type (#PCDATA)>
- <!ELEMENT res-auth (#PCDATA)>
- <!ELEMENT res-sharing-scope (#PCDATA)>
resource-ref子元素的描述如下:?
● res-ref-name是資源工廠引用名的名稱。該名稱是一個與java:comp/env上下文相對應的JNDI名稱,并且在整個Web應用中必須是惟一的。 ?
● res-auth表明:servlet代碼通過編程注冊到資源管理器,或者是容器將代表servlet注冊到資源管理器。該元素的值必須為Application或Container。?
● res-sharing-scope表明:是否可以共享通過給定資源管理器連接工廠引用獲得的連接。該元素的值必須為Shareable(默認值)或Unshareable。