在這一篇文章中,我們要用JNDI訪問我們的應用服務器配置好的多數據源。在本實例中,我們使用本地的tomcat服務器來模擬遠程服務器,由於本地只有mysql數據庫,故通過訪問不同的mysql數據庫不同database來模擬同時訪問不同數據庫如mysql和oracle等。
下面是我們的配置步驟。
首先在我們的tomcat服務器下找到conf文件夾里的server.xml文件,打開並找到 <GlobalNamingResources>
。在該節點下會有一個形如下面所示的全局資源
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
我們需要在這后面添加我們的數據源配置。如:
<Resource
name="jdbc/mysql1"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/yc1"/>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
<Resource
name="jdbc/mysql2"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/yc2"/>
然后需要在存放server.xml的同一個conf目錄下找到context.xml,在節點下加入如下示例配置信息
<ResourceLink global="jdbc/mysql1" name="jdbc/mysql1" type="javax.sql.DataSource" />
<ResourceLink global="jdbc/mysql2" name="jdbc/mysql2" type="javax.sql.DataSource" />
注意這里的global要和我們在server.xml中配置的數據源名字一樣
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/mysql1</value>
<!--java:comp/env是默認部分,
我們修改jdbc/mysql1對應我們在context.xml中配置<ResourceLink>中的name-->
</property>
</bean>
<bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/mysql2</value>
</property>
</bean>
在這里我配置兩個數據源來模擬連接兩個不同的數據庫。
在本實例中通過Hibernate整合SpringMVC來進行測試。
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<!-- MySQL的方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="javax.persistence.validation.mode">none</prop>
<!-- 必要時在數據庫新建所有表格 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="current_session_context_class">thread</prop>
<!-- <prop key="hibernate.format_sql">true</prop> -->
</props>
</property>
<property name="packagesToScan" value="com.yc.model1" />
</bean>
<bean id="sessionFactory2"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="current_session_context_class">thread</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="packagesToScan" value="com.yc.model2" />
</bean>
在這里我們定義兩個實體類,對應到兩個不同的庫表中。
/*****************實體類1*****************/
package com.yc.model1;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
//忽略getter和setter
}
/*****************實體類2*****************/
package com.yc.model2;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
//忽略getter和setter
}
create database yc1;
create database yc2;
至此,我們的初步測試配置已完成,這時候,運行tomcat服務器,進入mysql數據庫,依次執行命令
`use yc1;show tables;use yc2;show tables;`
會看到如下圖所示的結果
即hibernate幫我們自動對應實體創建表格了。到這里位置,我們的JNDI多數據源配置測試基本完成,但為了使我們的測試更加充分,不妨通過web配置具體測試一遍。
依次執行如下命令:
use yc1;INSERT INTO
User(
name) VALUES ('JNDITest1');
use yc2;INSERT INTO
User(
name) VALUES ('JNDITest2');
示例如下:
package com.yc.controller;
@Controller
public class JNDITestController {
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
@Autowired
@Qualifier("sessionFactory2")
private SessionFactory sessionFactory2;
@RequestMapping("testJNDI")
@ResponseBody
public String testJNDI(){
String name1 = (String) sessionFactory.openSession().createQuery("select name from User where id = 1").uniqueResult();
String name2 = (String) sessionFactory2.openSession().createQuery("select name from User where id = 1").uniqueResult();
return "name1 = " + name1 + "————name2 = "+ name2 ;
}
}
在游覽器中輸入如下url:http://localhost:8090/yc/testJNDI
,會得到游覽器響應:name1 = JNDITest1————name2 = JNDItest2
。示例圖片如下所示:
至此我們的配置和測試都已經完成了。這里囿於我的本地資源限制,沒有進行遠程服務器測試。也沒有進行真正的多數據庫測試,但原理都是類似的。
上面示例只是為了展示JDNI連接應用服務器配置多數據源的實際操作流程測試。但在實際應用中,面對多數據源,我們還需要針對我們的具體需求作更深入的DAO層設計配置。比如,我們可以結合AOP來針對我們的DAO層的不同訪問數據庫方法來完成我們的讀寫分離。具體實現請移步下篇文章。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。