如何创建 DataSource

Posted

tags:

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

你好,可以参见下面:
数据源是数据库连接池里面的概念,连接池就是指当服务器启动时,先建立几个连接,在应用需要与数据库连接时,就从连接池里获取,使用完以后,不是将连接断掉,而是放回到池里面,这样就减少了数据连接创建的次数,大大提高了连接性能。而数据源就是给服务器一个配置信息,然服务器就知道怎么使用JDBC驱动,比如url参数,数据库实例名、用户名与密码等等。Java中的数据源就是javax.sql.DataSource。DataSource的创建可以有不同的实现,下面以mysql为例介绍几种常见DataSource的创建方法:
一、JNDI方式创建DataSource
以JNDI方式创建数据源首先要配置数据源的相关连接信息,也就是数据源连接池。该配置应该在Tomcat安装目录下的conf/context.xml文件中配置,在Eclipse的J2EE架构下,也可以把context.xml文件创建在/META-INF目录下。其配置如下:
<Context><!--MySql-->
<Resource name="jdbc/movie" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="[用户名]" password="[密码]" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/[实例名]?autoReconnect=true"/>
</Context>
正确的配置后,就可以在程序中以JNDI的方式创建数据源,得到数据库连接并进行相应的操作。代码如下:

try
Context context = new InitialContext();
if (context == null)
throw new Exception("create context failed!");

DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/[实例名]");
if (ds == null)
Thread.sleep(2000);
ds = (DataSource) context.lookup("java:comp/env/jdbc/[实例名]");
if (ds == null)
throw new Exception("get datasource failed!");


catch (NamingException ne)
throw ne;
catch (Exception e)
throw e;


二、Apache提供的简单连接池创建数据源
以这种方式创建数据源必须先准备两个jar文件:commons-dbcp.jar 和 commons-pool.jar,将这两个jar包放到WEB-INF/lib目录下。以这种方式创建的数据源就不再是javax.sql.DataSource了,而是org.apache.commons.dbcp.BasicDataSource。而且不再需要配置任何文件就可以直接使用。代码如下:

// 创建BasicDataSource对象
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/[实例名]");
ds.setUsername("[用户名]");
ds.setPassword("[密码]");
ds.setInitialSize(50);
ds.setMaxActive(100);
ds.setMaxIdle(30);
ds.setMaxWait(10000);
// 关闭数据源连接
ds.close();

三、C3P0方式创建数据源
使用C3P0方式创建数据源应该首先准备一个jar文件:c3p0-0.9.1.2.jar,将其放到WEB-INF/lib目录下,就可以在项目中使用C3P0创建数据源,C3P0创建的数据源对象也不是DataSource对象,而是ComboPooledDataSource,代码如下:

// 创建ComboPooledDataSource对象
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/[实例名]");
ds.setUser("[用户名]");
ds.setPassword("[密码]");
ds.setInitialPoolSize(50);
ds.setMaxPoolSize(100);
ds.setMaxIdleTime(10000);

四、Proxool方式创建数据源
采用该方式创建数据源需要准备的jar包:proxool-01.9.0RC3.jar,将其放到WEB-INF/lib目录下,之后就可以项目中创建ProxoolDataSource对象,其代码如下:

// 创建ProxoolDataSource对象
ProxoolDataSource ds = new ProxoolDataSource();
ds.setDriver("com.mysql.jdbc.Driver");
ds.setDriverUrl("jdbc:mysql://localhost:3306/[实例名]");
ds.setUser("[用户名]");
ds.setPassword("[密码]");

五、BoneCP方式创建数据源
BoneCP是一个快速高效,开源免费的Java数据库接池。创作者称,BoneCP在性能上会完全超越所有主流的Java连接池。它可以帮你管理数据连接,让你的应用程序能更快速地访问数据库。比C3P0/DBCP(DataBaseconnection pool,数据库连接池)连接池快25倍。这个数据库连接池采用Google Collection作为内部的集合类框架,而且现在的版本已经很稳定。要使用BoneCP,必须用到的jar文件有:
· bonecp-0.6.5.jar
· google-collections-1.0.jar
· slf4j-api-1.5.11.jar
· slf4j-log4j12-1.5.11.jar
· log4j-1.2.15.jar
将这些jar包放到WEB-INF/lib目录下,就可以在程序中创建BoneCPDataSource对象,代码如下:

// 创建BoneCPDataSource对象
BoneCPDataSource ds = new BoneCPDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/[实例名]");
ds.setUsername("[用户名]");
ds.setPassword("[密码]");
ds.setAcquireIncrement(1);
ds.setAcquireRetryDelay(10000);
ds.setIdleConnectionTestPeriod(100);
ds.setMinConnectionsPerPartition(2);
ds.setMaxConnectionsPerPartition(20);
ds.setPartitionCount(2);

在创建完数据源之后,就可以利用jdbc在程序与数据库之间建立连接,但要注意的是,要有相关的jdbc驱动包,不同的数据库需要不同的驱动,一般在各个数据库官方网都可以获取。
望采纳!
参考技术A 是的时间里了山是多少

创建名为“dataSource”+ Spring Boot + Hibernate 的 bean 时出错

【中文标题】创建名为“dataSource”+ Spring Boot + Hibernate 的 bean 时出错【英文标题】:Error creating bean with name 'dataSource' + Spring Boot + Hibernate 【发布时间】:2018-01-25 03:28:17 【问题描述】:

我在启动有关如何访问 mysql 数据的 spring 指南时遇到了一些问题(请参阅此链接:https://spring.io/guides/gs/accessing-data-mysql/)。我稍微调整了类,所以我有这个代码:

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0      http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.springframework</groupId>
        <artifactId>gs-mysql-data</artifactId>
        <version>0.1.0</version>
    
        <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    </parent>
    
    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) -->
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <!-- Use MySQL Connector-J -->
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    </dependencies>
    
    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    </build>
    

我正在使用这个主控制器: MainController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import com.resource.iPbackend.UserRepository;
import com.resource.iPbackend.User;

@Controller
@RequestMapping(path = "/main")
public class MainController 

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(path = "/reg", method = RequestMethod.POST)
    public @ResponseBody String regNewUser (@RequestParam String firstName,      @RequestParam String lastName, @RequestParam String email, @RequestParam String password, @RequestParam String username) 
        User n = new User();
        n.setFirstName(firstName);
        n.setLastName(lastName);
        n.setEmail(email);
        n.setPassword(password);
        n.setUsername(username);
        userRepository.save(n);
        return "User is stored in database: " + n;
    

    @GetMapping(path = "/all")
    public @ResponseBody Iterable<User> getAllUsers() 
        return userRepository.findAll();
    

连同这个存储库: UserRepository.java

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.resource.iPbackend.User;


@Repository
public interface UserRepository extends CrudRepository<User, Long> 


还有这个实体: User.java

import org.springframework.data.annotation.Id;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
public class User 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private String username;

    public Integer getId() 
        return id;
    

    public void setId(Integer id) 
        this.id = id;
    

    public String getFirstName() 
        return firstName;
    

    public void setFirstName(String firstName) 
        this.firstName = firstName;
    

    public String getLastName() 
        return lastName;
    

    public void setLastName(String lastName) 
        this.lastName = lastName;
    

    public String getEmail() 
        return email;
    

    public void setEmail(String email) 
        this.email = email;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public String getUsername() 
        return username;
    

    public void setUsername(String username) 
        this.username = username;
    

最后我有了这个 Application.class:

@EnableAutoConfiguration
@SpringBootApplication
public class IPbackendApplication 

public static void main(String[] args) 

    SpringApplication.run(IPbackendApplication.class, args);


我收到此错误:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration”的bean时出错:通过构造函数参数0表示的不满足依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class] 中定义名称为“dataSource”的 bean 创建时出错:通过工厂方法进行 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.apache.tomcat.jdbc.pool.DataSource]:工厂方法 'dataSource' 抛出异常;嵌套异常是 java.lang.IllegalArgumentException: URL 必须以 'jdbc' 开头 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 在 org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE]

感谢您的帮助!

【问题讨论】:

缺少相关代码:spring 使用的数据库配置在哪里? 【参考方案1】:

查看异常跟踪中的这条消息:

嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[org.apache.tomcat.jdbc.pool.DataSource]:工厂方法 'dataSource' 抛出异常;嵌套异常是 java.lang.IllegalArgumentException: URL 必须以 'jdbc' 开头 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)

您很可能没有提供重视spring.datasource.url 属性的application.properties 文件。 否则你没有正确地评估它。

它应该看起来像:

spring.datasource.url=jdbc:mysql://localhost/mydb

您可以参考the Spring Boot documentation。

【讨论】:

【参考方案2】:

您分享的最后一个属性有一些错误需要修复spring.datasource.data-username=myuserspring.datasource.data-password=ThePassword

这是如何正确配置 spring 数据源的示例

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=myuser
spring.datasource.password=ThePassword

这是Spring documentation的另一个例子

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

【讨论】:

【参考方案3】:

我在尝试测试我的 dao 层时收到了非常相似的错误。

@RunWith(SpringRunner.class)
@DataJpaTest
public class ItemRepositoryTest 

    @Autowired
    private ItemRepository itemRepository;

    @Test
    public void findAll() 
        List<Item> allItems = itemRepository.findAll();
        Assertions.assertThat(allItems).hasSize(9);
    

问题已通过添加解决:

@AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.NONE)

到测试班:

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.NONE)
public class ItemRepositoryTest ...

【讨论】:

以上是关于如何创建 DataSource的主要内容,如果未能解决你的问题,请参考以下文章

spring

javamail发送二进制流附件的问题

在tomcat中绑定JNDI数据源?

java的反射

SPRING 动态注册BEAN

SPRING 动态注册BEAN