spring學習筆記(18)使用JNDI模擬訪問應用服務器多數據源實例


在這一篇文章中,我們要用JNDI訪問我們的應用服務器配置好的多數據源。在本實例中,我們使用本地的tomcat服務器來模擬遠程服務器,由於本地只有mysql數據庫,故通過訪問不同的mysql數據庫不同database來模擬同時訪問不同數據庫如mysql和oracle等。
下面是我們的配置步驟。

1. 在服務器配置全局數據源

首先在我們的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中配置的數據源名字一樣

2. 在Spring容器中配置JNDI連接池信息

<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>

在這里我配置兩個數據源來模擬連接兩個不同的數據庫。

3. 測試連接

在本實例中通過Hibernate整合SpringMVC來進行測試。

1. 在IOC容器中配置

<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>

2. 定義我們的實體類

在這里我們定義兩個實體類,對應到兩個不同的庫表中。

   /*****************實體類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
}

3. 在mysql中創建數據庫yc1和yc2:

create database yc1;
create database yc2;

至此,我們的初步測試配置已完成,這時候,運行tomcat服務器,進入mysql數據庫,依次執行命令
`use yc1;show tables;use yc2;show tables;`
會看到如下圖所示的結果

這里寫圖片描述
即hibernate幫我們自動對應實體創建表格了。到這里位置,我們的JNDI多數據源配置測試基本完成,但為了使我們的測試更加充分,不妨通過web配置具體測試一遍。

4. 在數據表中插入測試數據

依次執行如下命令:
use yc1;INSERT INTOUser(name) VALUES ('JNDITest1');
use yc2;INSERT INTOUser(name) VALUES ('JNDITest2');

5. 配置Controller

示例如下:

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 ;

}
}

6. 重啟tomcat服務器

在游覽器中輸入如下url:http://localhost:8090/yc/testJNDI,會得到游覽器響應:name1 = JNDITest1————name2 = JNDItest2。示例圖片如下所示:
這里寫圖片描述

4. 測試小結

至此我們的配置和測試都已經完成了。這里囿於我的本地資源限制,沒有進行遠程服務器測試。也沒有進行真正的多數據庫測試,但原理都是類似的。

上面示例只是為了展示JDNI連接應用服務器配置多數據源的實際操作流程測試。但在實際應用中,面對多數據源,我們還需要針對我們的具體需求作更深入的DAO層設計配置。比如,我們可以結合AOP來針對我們的DAO層的不同訪問數據庫方法來完成我們的讀寫分離。具體實現請移步下篇文章。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com