Servlet容器中的数据源

本文介绍如何在Servlet容器中配置并使用数据源。通过在context.xml中设置DataSource参数,并在web.xml中引用,最终在Java代码中通过JNDI获取连接。

    Servlet容器对它提供的数据源javax.sql.DataSource对象使用了JNDI技术绑定了一个name值。

    servlet容器中的JNDI:在javax.naming包中提供了Context接口,它有bind(String name,Object object)和lookup(String name)两个方法来绑定和获得对象。servlet容器把DataSource作为一种资源来处理,生成DataSource的工厂为org.apache.commons.dbcp.BasicDataSourceFactory.

    知道了servlet容器怎么提供数据源对象后,要如何使用??

    1.首先,配置数据源。在META-INF中配置context.xml。

 <Context  reloadable="true" >
  <Resource name="指定要绑定的名字" auth="指定有谁来管理(Container或Application)"  type="javax.sql.DataSource"
     maxActive="100" maxIdle="30" maxWait="10000"
     username="dbuser" password="1234"
     driverClassName="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:3306/BookDB?useUnicode=true&amp;characterEncoding=GB2312"/> 
</Context>

maxActive和maxIdle分别指定活动和空闲状态的连接的数目。maxWait指定空闲的最大时长。

 

    2.在web.xml中配置<resource-ref>

<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/BookDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

     3.在java程序中访问数据源

       Context ctx = new InitialContext();

       Context envCtx = (Context) initCtx.lookup("java:comp/env");

       DataSource ds = (DataSource)enctx.lookup(JNDI中绑定的name值);

       Conntection con = ds.getConnection();

      ....

另:加了java:comp/env则需要在web.xml中配置<resource-ref>元素java:comp/env是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。 在J2EE中的引用常用的有:    

---------JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明

---------JMS 连接工厂在java:comp/env/jms 子上下文中声明

---------JavaMail 连接工厂在java:comp/env/mail 子上下文中声明

---------URL 连接工厂在 java:comp/env/url子上下文中声明

 

 

还有,注意要把数据库驱动器的jar包放在tomcat下的lib中

如果你想在Spring框架的Servlet容器初始化之前切换数据源,并且数据源已经在应用启动时预先加载,你可以通过配置数据源动态切换机制来实现。这通常涉及到以下几个步骤: 1. **使用AOP(面向切面编程)**: 使用Spring AOP(Aspect Oriented Programming),例如`@Profile`或`@ConditionalOnProperty`注解,可以在特定条件下(如环境变量、系统属性等)切换数据源。 ```java @Configuration @EnableJpaRepositories(pro entityManagerFactoryRef = "dataSourceBasedOnEnvironment") public class DataSourceConfig { @Profile("prod") @Bean(name = "prodEntityManagerFactory") public LocalContainerEntityManagerFactoryBean prodEntityManagerFactory() { // 配置基于Prod数据源的实体管理工厂 } @Profile("dev") @Bean(name = "devEntityManagerFactory") public LocalContainerEntityManagerFactoryBean devEntityManagerFactory() { // 配置基于Dev数据源的实体管理工厂 } @Profile({"prod", "dev"}) @Primary @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { return new JpaTransactionManager(emf); } } ``` 在这个例子中,`prodEntityManagerFactory`和`devEntityManagerFactory`分别对应不同的数据源,`transactionManager`则根据当前激活的profile选择相应的EntityManagerFactory。 2. **编写Mapper代理**: 使用Spring的SqlSessionFactory或MyBatis的SqlSessionTemplate,创建一个代理,这个代理可以根据上下文切换数据源。比如,可以使用Spring的`TargetSourceAware`接口: ```java @Autowired private Environment env; @Autowired @Bean public SqlSessionTemplate sqlSessionTemplate(@Qualifier("dataSourceBasedOnEnvironment") DataSource dataSource) { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(dataSource); return new TargetDataSourceAwareSqlSessionTemplate(sqlSessionFactory, dataSource); } public SqlSessionFactory getSqlSessionFactory(DataSource dataSource) { SqlSessionFactoryBuilder builder = ...; // 初始化sqlSessionFactoryBuilder return builder.build(dataSource); } @Override public void setTargetDataSource(DataSource targetDataSource) { this.sqlSessionFactory = getSqlSessionFactory(targetDataSource); // 更新SqlSessionFactory } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值