【Java Web开发学习】Spring配置数据源

Spring配置数据源

转载:https://www.cnblogs.com/yangchongxing/p/10027495.html

==============================================================

目录

1、使用JNDI数据源
2、使用嵌入式数据源
3、使用C3P0数据源

===============================================================

1、使用JNDI数据源

Spring应用程序经常部署在Java EE应用服务器中,如WebSphere、JBoss或甚至像Tomcat这样的Web容器中。这些服务器允许你配置通过JNDI获取数据源。这种配置的好处在于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。

参考文档:The Tomcat JDBC Connection Pool   https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html

在服务器的server.xml的Context元素下配置Resource

<Resource
 name="jdbc/mysql"
 auth="Container"
 type="javax.sql.DataSource"
 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
 testWhileIdle="true"
 testOnBorrow="true"
 testOnReturn="false"
 validationQuery="SELECT 1"
 validationInterval="30000"
 timeBetweenEvictionRunsMillis="30000"
 maxActive="100"
 minIdle="10"
 maxWait="10000"
 initialSize="10"
 removeAbandonedTimeout="60"
 removeAbandoned="true"
 logAbandoned="true"
 minEvictableIdleTimeMillis="30000"
 jmxEnabled="true"
 jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
 username="root"
 password="123456"
 driverClassName ="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/ycxfw"
 />

Java配置查找数据源

package cn.ycx.config;

import javax.naming.NamingException;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.jndi.JndiObjectFactoryBean;

@Profile("PROD")
@Configuration
public class JndiDataSourceConfig {
    @Bean
    public DataSource dataSource() throws IllegalArgumentException, NamingException {
        System.out.println("JndiDataSourceConfig...");
        JndiObjectFactoryBean jndi = new JndiObjectFactoryBean();
        jndi.setJndiName("jdbc/mysql");
        jndi.setResourceRef(true);//自动添加 java:comp/env/ 前缀
        jndi.setProxyInterface(javax.sql.DataSource.class);
        jndi.afterPropertiesSet();
        return (DataSource) jndi.getObject();
    }
}

使用xml配置数据源时需要使用注解@ImportResource(value="classpath:context.xml")导入xml文件

@Profile("PROD")
@Configuration
@ImportResource(value="classpath:context.xml")
public class JndiDataSourceConfig
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysql" resource-ref="true"></jee:jndi-lookup>

2、使用嵌入式数据源

package cn.ycx.config;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;

@Profile("DEV")
@Configuration
public class EmbededDataSourceConfig {
    @Bean
    public DataSource dataSource() {
        System.out.println("EmbededDataSourceConfig...");
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("classpath:schema.sql")
                .addScript("classpath:data.sql")
                .build();
    }
}

使用xml配置数据源时需要使用注解@ImportResource(value="classpath:context.xml")导入xml文件

@Profile("DEV")
@Configuration
@ImportResource(value="classpath:context.xml")
public class EmbededDataSourceConfig
<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:data.sql"/>
</jdbc:embedded-database>

3、使用C3P0数据源

Java配置

package cn.ycx.web.config;

import java.beans.PropertyVetoException;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.mchange.v2.c3p0.ComboPooledDataSource;

@Configuration
public class DataSourceConfig {
    @Bean(name="dataSource")
    public DataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource =  new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
        comboPooledDataSource.setJdbcUrl("jdbc:mysql:///ycxdb?useUnicode=true&autoReconnect=true&rewriteBatchedStatements=TRUE");
        comboPooledDataSource.setUser("root");
        comboPooledDataSource.setPassword("123456");
        comboPooledDataSource.setInitialPoolSize(10);
        comboPooledDataSource.setMinPoolSize(10);
        comboPooledDataSource.setMaxPoolSize(50);
        comboPooledDataSource.setMaxIdleTime(3600);
        // 解决mysql timeout
        comboPooledDataSource.setTestConnectionOnCheckout(false);
        comboPooledDataSource.setTestConnectionOnCheckin(true);
        comboPooledDataSource.setIdleConnectionTestPeriod(3600);
        return comboPooledDataSource;
    }
}

xml配置

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql:///ycxdb?useUnicode=true&autoReconnect=true&rewriteBatchedStatements=TRUE" />
    <property name="user" value="root" />
    <property name="password" value="123456" />
    <property name="initialPoolSize" value="10" />
    <property name="minPoolSize" value="10" />
    <property name="maxPoolSize" value="50" />
    <property name="maxIdleTime" value="3600" />
    <!-- 解决mysql timeouts -->
    <property name="testConnectionOnCheckout" value="${jdbc.testConnectionOnCheckout}" />
    <property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}" />
    <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" />
</bean>

 

使用数据源的Java业务代码

package cn.ycx.service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class IndexServiceImpl implements IndexService {

    @Autowired
    private DataSource dataSource;
    
    @Override
    public List<Map<String, String>> get() {
        try {
            List<Map<String, String>> list = new ArrayList<Map<String, String>>();
            Map<String, String> item = null;
            Connection con = dataSource.getConnection();
            Statement stm = con.createStatement();
            ResultSet rs = stm.executeQuery("select id,username from user");
            while(rs.next()) {
                item = new HashMap<String, String>();
                item.put("id", rs.getString("id"));
                item.put("username", rs.getString("username"));
                list.add(item);
            }
            rs.close();
            stm.close();
            con.close();
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public Map<String, String> add() {
        try {
            Random r = new Random();
            LocalDateTime dt = LocalDateTime.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
            Connection con = dataSource.getConnection();
            PreparedStatement pstm = con.prepareStatement("insert into user(id,username)values(?,?)");
            pstm.setString(1, dt.format(formatter));
            pstm.setString(2, String.valueOf(r.nextInt()));
            int count = pstm.executeUpdate();
            pstm.close();
            con.close();
            Map<String, String> data = new HashMap<String, String>();
            data.put("status", String.valueOf(count));
            return data;
        } catch (Exception e) {
            
        }
        return null;
    }
}

注入数据源

@Autowired
private DataSource dataSource;

使用Connection con = dataSource.getConnection();取得链接

 

转载于:https://www.cnblogs.com/yangchongxing/p/10027495.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值