在使用JBOSS數據源的時候出現,版本為jboss-4.0.4RC1,使用default配置,添加一個mysql的數據源
1.將mysql包mysql-connector-java-5.0.0-beta-bin.jar拷到.\default\lib下
2.環境變量設置了JAVA_HOME和JBOSS_HOME
3.修改mysql-ds.xml到deploy目錄,內容為:
<?xml version="1.0" encoding="UTF-8"?> <datasources> ? <local-tx-datasource> ??? <jndi-name>MySqlDS</jndi-name> ??? <connection-url>jdbc:mysql://127.0.0.1:3306/testdb</connection-url> ??? <driver-class>com.mysql.jdbc.Driver</driver-class> ??? <user-name>root</user-name> ??? <password>root</password> ??? <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> ??? <metadata> ?????? <type-mapping>mySQL</type-mapping> ??? </metadata> ? </local-tx-datasource> </datasources>
4.在JSP中進行測試:
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="javax.sql.DataSource" %> <%@ page import="javax.naming.*" %> <html> <head> <title> index </title> </head> <body bgcolor="#ffffff"> <% ?? DataSource datasource = null; try ?? { ???? InitialContext initialContext = new InitialContext(); ???? datasource = (DataSource) initialContext.lookup("java:/MySqlDS"); ???? if (datasource == null) { ?????? out.print("null"); ???? }else { ?????? java.sql.Connection con = datasource.getConnection(); ?????? java.sql.ResultSet rs = con.createStatement().executeQuery("select * from MYTABLE"); ?????? while (rs.next()) { ???????? out.print("<BR>---------"); ?????? } ???? } }catch (Exception e) { ? out.print("" + e); ? e.printStackTrace(); } %>
5.訪問該JSP的時候總是出現:
javax.naming.NameNotFoundException: MySqlDS not bound
JNDI名換成了java:comp/env/jdbc/MySqlDS,java:comp/env/MySqlDS, jdbc/MySqlDS, MySqlDS 這些都不行,都是出現沒有綁定的錯誤.
這個問題困擾了我兩天,到處搜索相關JBOSS下的數據源配置,找出一大把,結果一看全都是一樣的文章,只是在不同的網站出現而已,我不得不感慨:天下文章一大抄!! 還到各大論壇發貼子, 未果, 都不知道那些人到底有沒有真正的配置過這些東西, 不過在網上折騰了兩天還是找到一點點線索, 通過反復的窮舉試的測試, 終于解決了問題.(本來寫這個貼子是為了貼出來問大家的,不過在寫的過程中解決了問題,所以就一并寫下來, 以讓后來者不必寫這些彎路)
在網上的貼子都是說配置*-ds.xml文件時, JBOSS使用的是本地JNDI, 也就是說在JBOSS容器里才能看到和使用這個JNDI, 按這種說法, 我在JSP里查找那個數據庫就沒有問題呀, 不明白!
即然JBOSS提供了本地的JNDI, 那也可以設成和Weblogic一樣的那種JNDI, 不讓JBOSS加上那些莫名其妙的前綴了, 因此在mysql-ds.xml的加入<use-java-context>false</use-java-context>到<jndi-name>MySqlDS</jndi-name>下面, 這樣就可以直接通過MySqlDS做為JNDI名來查尋這個數據源了,JSP代碼就改為initialContext.lookup("MySqlDS");
mysql-ds.xml文件既為:
<?xml version="1.0" encoding="UTF-8"?> <datasources> ? <local-tx-datasource> ??? <jndi-name>MySqlDS</jndi-name> ??? <use-java-context>false</use-java-context> ??? <connection-url>jdbc:mysql://127.0.0.1:3306/testdb</connection-url> ??? <driver-class>com.mysql.jdbc.Driver</driver-class> ??? <user-name>root</user-name> ??? <password>root</password> ??? <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> ??? <metadata> ?????? <type-mapping>mySQL</type-mapping> ??? </metadata> ? </local-tx-datasource> </datasources>
還有就是通過現在的方式是可以查尋了, 不過我還不知道使用java:/前綴來查尋數據源的方式到底是什么原因導致錯誤........
...以上方式是配置Global JNDI, 最后我才發現自已犯了一個白癡錯誤: 我把..\default\lib下的jboss-*.jar文件拷貝到了我的WAR包的WEB-INF\lib中去了. 在運行過程中用的就是這個lib中的jar包了, 把這些包去掉去加上java:/前綴就可以正常查找本地JNDI了. 使用自已WAR包中的jboss-*.jar包可能會導致ClassLoader的變化, 不能找到相應的容器中的JNDI配置吧.糾纏我幾三天的麻煩擺平了,我心釋然~~~
|