通过 XML 实现 DataSource(数据源)注入

21 篇文章 0 订阅

这里介绍 Spring 提供的 3 种通过 Xml 实现 DataSource(数据源)注入的方式:使用 Spring

自带的 DriverManagerDataSource、使用 DBCP 连接池和使用 Tomcat 提供的 JNDI。下面分

别来进行介绍。

 

 

1  使用 Spring 自带的 DriverManagerDataSource

 

 

在第 6 章的例子中,所有示例的配置文档对于 DataSource 的注入,使用的都是 Spring 提供

 DriverManagerDataSource。使用 DriverManagerDataSource 的在效率上和直接使用 Jdbc 

有多大的区别,使用 DriverManagerDataSource 的配置文档示例代码如下:

 

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

 "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

        <!—设定 dataSource -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName">

            <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> 

        </property>

        <property name="url">

            <value>jdbc:microsoft:sqlserver://localhost:1433/stdb</value> 

        </property>

        <property name="name">

                        <value>admin</value>  

        </property>

        <property name="msg">

                        <value>admin</value>  

        </property>

</bean>

<!—设定 transactionManager -->


    <bean id="transactionManager"

   class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

 

      <property name="dataSource">

            <ref bean="dataSource"/>

        </property>    

    </bean>                                                                                                                                                   

    <bean id="helloDAO" class="com.gc.action.HelloDAO">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

        <property name="transactionManager">

            <ref bean="transactionManager"/>

        </property>

    </bean>

</beans>

 

配置文档中 id  helloDAO  Bean 的示例代码在第 6 章已经讲解过,这里只是把示例代码

展示出来,以示过程的完整性。HelloDAO.java 的示例代码如下:

 

//******* HelloDAO.java**************

package com.gc.action; 

 

import javax.sql.DataSource; 

import org.springframework.jdbc.core.*; 

import org.springframework.transaction.*; 

import org.springframework.transaction.support.*; 

import org.springframework.dao.*; 

 

public class HelloDAO { 

    private DataSource dataSource; 

    private PlatformTransactionManager transactionManager; 

 

    public void setDataSource(DataSource dataSource) { 

        this.dataSource = dataSource; 

        }  

 

    public void setTransactionManager(PlatformTransactionManager transactionManager) { 

        this.transactionManager = transactionManager; 

        }  

 

    public int create(String msg) { 


        TransactionTemplate transactionTemplate new  TransactionTemplate(transactionManager); 

Object result = transactionTemplate.execute( 

            new TransactionCallback() { 

                        public Object doInTransaction(TransactionStatus status) { 

                        //  执行新增的操作,向数据库新增一笔记录

   …….

                        //  返回值是 resultObject

                        return resultObject;  

                });

        }  

}



 2  使用 DBCP 连接池

 

 

Spring 也提供了对 DBCP 连接池的支持,可以直接在配置文档中配置 DBCP 数据库连接池,

要在 Spring 中使用 DBCP 连接池,需要将 spring-framework-2.0-m1/lib/jakarta-commons 文件

夹中的 commons-collections.jarcommons-dbcp.jar  commons-pool.jar 用前面介绍的方法加

入到 ClassPath 中,使用 DBCP 连接池的示例代码如下:

 

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

 "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

        <!—设定 dataSource -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close">  

              <!—使用 sqlserver 数据库 --> 

   <property name="driverClassName">

            <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> 

        </property>

      <!—设定 Url -->

        <property name="url">

            <value>jdbc:microsoft:sqlserver://localhost:1433/stdb</value> 

        </property>

                <!—设定用户名-->

        <property name="name">

                        <value>admin</value>  

        </property>

      <!—设定密码-->

        <property name="msg">

                        <value>admin</value>  

        </property>

</bean>

<!—设定 transactionManager -->


    <bean id="transactionManager"

                                      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>    

    </bean>

                                                                                                                                                  

    <bean id="helloDAO" class="com.gc.action.HelloDAO">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

        <property name="transactionManager">

            <ref bean="transactionManager"/>

        </property>

    </bean>

</beans>

 

HelloDAO 类的代码和上面的一样,不用改变,这里就不在展示了。

 

3  使用 Tomcat 提供的 JNDI

 

 

与使用 DBCP 连接池外相比,使用 Spring 来进行 Web 开发,更多的是使用 Web 容器提供的

数据库连接池功能,这里以使用 Tomcat 容器为例,来讲解一下在 Spring 中,使用 Tomcat

提供的 JNDI 应该如何配置。首先要在 Tomcat  server.xml 中添加一下代码:

 

<Context path="/myApp" reloadable="true" 

docBase="D:/eclipse/workspace/myApp" workDir="D:/eclipse/workspace/myApp/work" >  

<Resource name="jdbc/opendb" auth="Container" 

type="javax.sql.DataSource" 

factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"

driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" 

url=" jdbc:microsoft:sqlserver://localhost:1433/stdb" 

<!—设定用户名-->

name="admin" 

<!—设定密码-->

msg="admin" 

<!—设定最大连接数-->

maxActive="10000"

<!—连接最大空闲时间-->

maxIdle="10000" 

<!—连接最大等待时间-->

maxWait="10000" 

removeAbandoned="true" 

removeAbandonedTimeout="10" 

logAbandoned="true"

/></Context>

 

然后 Spring 的配置文档的示例代码如下:

 

<?xml version="1.0" encoding="UTF-8"?>  

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

 "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

        <!—设定 dataSource -->

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

        <property name="jndiName">

            <value>jdbc/opendb</value>

        </property>

    </bean>  

<!—设定 transactionManager -->


    <bean id="transactionManager"

                                       class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>    

    </bean>

                                                                                                                                                 

    <bean id="helloDAO" class="com.gc.action.HelloDAO">

        <property name="dataSource">

            <ref bean="dataSource"/> 


        </property>

        <property name="transactionManager">

            <ref bean="transactionManager"/>

        </property>

    </bean>

</beans>

 

同样,HelloDAO 的代码不用改变。

上面介绍的这 3 种实现 DataSource 注入的方式,给开发人员的的 Jdbc 编程带来了极大的方

便,主要是因为 Spring  Jdbc 进行了良好的封装。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是通过 dynamic datasource 实现在启动中动态添加删除数据源的源码: 首先,需要引入 dynamic-datasource-spring-boot-starter 依赖。在 pom.xml 文件中添加以下代码: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>2.5.0</version> </dependency> ``` 接下来,创建一个配置类 DynamicDataSourceConfig,用于配置动态数据源。在该类中,需要定义一个 Map 用于存储数据源配置信息,以及一个默认数据源名。并且,需要使用 @ConfigurationProperties 注解注入 dynamic 数据源的配置信息。 ```java @Configuration @ConfigurationProperties(prefix = "spring.datasource.dynamic") public class DynamicDataSourceConfig { private Map<String, DataSourceProperties> datasources = new HashMap<>(); private String primary; // getter 和 setter 方法省略 } ``` 接着,在配置类中创建一个 DynamicDataSource 对象,并使用 @Bean 注解将其注入到容器中。在创建 DynamicDataSource 对象时,需要传入一个 DataSourceCreator 对象,该对象用于创建数据源。 ```java @Bean public DataSource dataSource() { Map<String, DataSource> dataSourceMap = new HashMap<>(); for (String key : datasources.keySet()) { DataSourceProperties properties = datasources.get(key); DataSource dataSource = createDataSource(properties); dataSourceMap.put(key, dataSource); } DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setDefaultTargetDataSource(dataSourceMap.get(primary)); return dynamicDataSource; } private DataSource createDataSource(DataSourceProperties properties) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(properties.getUrl()); dataSource.setUsername(properties.getUsername()); dataSource.setPassword(properties.getPassword()); dataSource.setDriverClassName(properties.getDriverClassName()); dataSource.setInitialSize(properties.getInitialSize()); dataSource.setMaxActive(properties.getMaxActive()); dataSource.setMinIdle(properties.getMinIdle()); dataSource.setMaxWait(properties.getMaxWait()); return dataSource; } ``` 最后,在启动类中开启动态数据源功能。在启动类中,需要使用 @EnableDynamicDataSource 注解开启动态数据源功能。 ```java @EnableDynamicDataSource @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 现在,就可以通过修改配置文件或者数据库中的数据源配置信息,来动态添加或删除数据源了。同时,也可以通过注解 @DS("数据源名") 来切换数据源

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值