20200107——记spring的DataSource

Posted sunshine106

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20200107——记spring的DataSource相关的知识,希望对你有一定的参考价值。

spring项目中总要跟数据库打交道,其中怎么连接数据库的方法都有很多,大概分为3类:

1) 通过JNDI获取应用服务器(如JBOSS, Tomcat) 的数据源

2)  Spring容器中直接配置数据源

3)代码直接创建数据源,这个一般用于单元测试

然后每种都来记一记:

一:  JNDI获取应用服务器的数据源

 首先应用服务器里要定义好数据源,例如JBoss:

jboss/v6.3.0.8.0/standalone/configuration/standalone.xml

这里的JNDI-name="java:/jdbc/OracleDS"

                 <datasource jndi-name="java:/jdbc/OracleDS" pool-name="OracleDS" enabled="true">
                    <connection-url>jdbc:oracle:thin:@test:1521:bb</connection-url>
                    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
                    <driver>oracle</driver>
                    <pool>
                        <min-pool-size>20</min-pool-size>
                    </pool>
                    <security>
                        <security-domain>UA_AUTHENTICATION_INFO</security-domain>
                    </security>
                    <validation>
                        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
                    </validation>
                </datasource>

 

然后到spring项目中,有2中方式获取应用服务器的数据源:

第一种是:JndiObjectFactoryBean,如:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">        
    <property name="jndiName" value="java:/jdbc/OracleDS"/>        
</bean>

 

第二种是jee命名空间jndi-lookup,如

<beans xmlns=http://www.springframework.org/schema/beans     
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance     
xmlns:jee=http://www.springframework.org/schema/jee     
xsi:schemaLocation="http://www.springframework.org/schema/beans      
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd      
http://www.springframework.org/schema/jee     
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">       
       <jee:jndi-lookup id="dataSource" jndi-name=" java:/jdbc/OracleDS"/>       
</beans>

上面2中,都用到了jndi-name="java:/jdbc/OracleDS",就是上面应用服务器的数据源定义。

 

二:  spring容器中配置数据源

利用第三方依赖包,一个是apache的DBCP,一个是C3P0。

DBCP:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"        
        destroy-method="close">        
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />       
    <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />       
    <property name="username" value="root" />       
    <property name="password" value="1234" />       
</bean>

 

C3P0:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"        
        destroy-method="close">       
    <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>       
    <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/>       
    <property name="user" value="admin"/>       
    <property name="password" value="1234"/>       
</bean>

 

到底谁好,后续再学再记。

 

三:代码自己实现连接

1) 通过DriverManager, 位于JDK中java/sql/包下,是JDBC1.0,需要硬性编码驱动,不支持连接池,代码如:

     //此处的Class.forName删掉,intellij 也能跑成功,所以这句要不要后续待查
         Class.forName("com.mysql.jdbc.Driver");
        try {
            Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);

            Statement statement = connection.createStatement();
           
        } catch (SQLException e) {
            e.printStackTrace();
        }

 

2) 通过各种DataSource实现类

DataSource是一个接口,有很多实现DataSource接口,如上面的DBCP的BasicDataSource,C3P0中的ComboPooledDataSource,都是实现了这个接口,还有spring 自带了 DriverManagerDataSource ,还有Oracle的OracleDataSource.

所以这些实现类都可以直接在类中使用来创建连接

DBCP:

  BasicDataSource ods = new BasicDataSource();
  ods.setUrl("jdbc:oracle:thin:@test:1521:ua");
  ods.setUsername("test");
  ods.setPassword("test");
  Connection conn = ods.getConnection();
       

C3P0:

 ComboPooledDataSource ods = new ComboPooledDataSource();
 ods.setJdbcUrl("jdbc:oracle:thin:@test:1521:ua");
 ods.setUser("test");
 ods.setPassword("test");
 Connection conn = ods.getConnection();

Spring 的DriverManagerDataSource 

DriverManagerDataSource ods = new DriverManagerDataSource ();
ods.setUrl("jdbc:oracle:thin:@test:1521:ua");
ods.setUsername("test");
ods.setPassword("test");
Connection conn = ods.getConnection();

当然也可以直接用具体数据库驱动里的,比如Oracle和MySql

Oracle的 OracleDataSource

OracleDataSource ods = new OracleDataSource();
ods.setUrl("jdbc:oracle:thin://localhost:3309/sampledb");       
ods.setUsername("root");       
ods.setPassword("1234");       
Connection actualCon = ods.getConnection();

 MySql:

 
OracleDataSource ods = new MysqlDataSource();
ods.setUrl("jdbc:mysql://localhost:3309/sampledb");       
ods.setUsername("root");       
ods.setPassword("1234");       
Connection actualCon = ods.getConnection();

 上面的BasicDataSource是可以解决不同数据库不同操作dataSource, 具体可以参考:

https://www.journaldev.com/2509/java-datasource-jdbc-datasource-example

 


以上是关于20200107——记spring的DataSource的主要内容,如果未能解决你的问题,请参考以下文章

spring声明式事务的配置

无法使用相对路径导入 Spring bean 定义文件

(汇总)Spring Boot 实践折腾记 & Spring Boot 2.x 实践记

spring注入processengine 怎么在java中拿到

sping揭秘21Spring动态数据源的切换

19.springboot+mybatis多数据源