比如有XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/openstarbbs</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>sa</password>
<use-java-context>false</use-java-context>
<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>
很明顯,我們添加了<use-java-context>false</use-java-context>。關於<use-java-context>false</use-java-context>的文檔說明,自己GOOGLE一下就OK。
只要配置了<use-java-context>false</use-java-context>。我們使用JNDI查找就要這樣去尋
找配置在JBOSS裏的JNDI數據源:
Context ctx = new InitialContext(); //得到初始化上下文
Object obj = ctx.lookup("MySqlDS");//這樣查找數據源,不要 lookup("java:MySqlDS");
這樣做的好處就是解決了不在同一VM裏導致的javax.naming.NameNotFoundException: MySqlDS not bound 異常。
當然,包括所有依賴於JBOSS裏JNDI數據源的所有BEAN都要改成lookup("MySqlDS")。如果DAO層使用了@PersistenceContext註解進行注入,那麼需求該改該EJB組件的persistence.xml配置文件,改成:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="OpenStarBBS" transaction-type="JTA">
<jta-data-source>MySqlDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="showSql" value="true"/>
</properties>
</persistence-unit>
</persistence>
主要就是修改:<jta-data-source>MySqlDS</jta-data-source>。
如果不配置<use-java-context>false</use-java-context>,我們需要:
Context ctx = new InitialContext(); //得到初始化上下文
Object obj = ctx.lookup("java:MySqlDS");
而該EJB組件的persistence.xml配置文件爲:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="OpenStarBBS" transaction-type="JTA">
<jta-data-source>java:MySqlDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="showSql" value="true"/>
</properties>
</persistence-unit>
</persistence>
這樣做之後只能在同一VM裏lookup到MySqlDS數據源JNDI。
我一直在想,需要把數據源暴露開麼?一般EJB應用是會話BEAN發佈一個遠程BEAN,之後展現層在通過這個BEAN取到數據,需要在展現層裏寫訪問數據源的代碼嗎?所以,最後我又把<use-java-context>false</use-java-context>從配置文件裏去掉了。感覺這到清爽。