在使用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配置吧.纠缠我几三天的麻烦摆平了,我心释然~~~
|