Java JDBC 数据源
数据源有2种:
- 普通数据源 即数据库驱动自带的数据源
- 连接池 包括数据库驱动自带的连接池,以及DBCP、C3P0等常用的第三方连接池。
数据库驱动自带的数据源
//从properties文件加载数据源配置
Properties properties = new Properties();
InputStream is = Class.forName("test.Test").getResourceAsStream("/mysqlDataSource.properties");
properties.load(is);
String url=properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password"); //设置普通数据源,因为使用的是MysqlDataSource类,驱动自然只能是mysql的驱动,这个类已经把数据库驱动设置好了,不用我们设置。
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl(url); //还有个方法setURL(),这2个方法完全一样,因为setURL()的函数体就是调用setUrl()
mysqlDataSource.setUser(user);
mysqlDataSource.setPassword(password); //获取连接,操作数据库
Connection connection = mysqlDataSource.getConnection();
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"chy");
preparedStatement.setInt(2,20);
preparedStatement.setInt(3,100);
preparedStatement.executeUpdate();
preparedStatement.close();
connection.close();
我导入的是Mysql的数据库驱动,mysql驱动提供的自然是mysql数据源,已经默认注册了mysql数据库驱动,我们不必手动注册。如果导入的其他数据库的驱动,提供的自然就是该种数据库的数据源。
一般来说,数据库驱动都会提供2种数据源:普通数据源、连接池。
mysql驱动提供的普通数据源是MysqlDataSource,连接池是MysqlConnectionPoolDataSource,看名字就知道是连接池数据源。
数据库驱动自带的连接池
//从properties文件加载数据源配置
Properties properties = new Properties();
InputStream is = Class.forName("test.Test").getResourceAsStream("/mysqlDataSource.properties");
properties.load(is);
String url=properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password"); //设置连接池
MysqlConnectionPoolDataSource poolDataSource = new MysqlConnectionPoolDataSource();
poolDataSource.setURL(url);
poolDataSource.setUser(user);
poolDataSource.setPassword(password); //获取连接,操作数据库
Connection connection = poolDataSource.getConnection();
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"chy");
ps.setInt(2,20);
ps.setInt(3,99);
ps.executeUpdate();
connection.close();
普通数据源采用直连数据库的方式,调用 getConnection() 获取连接时,实际上底层仍是调用 DriverManager.getConnection(url, user, password); 来获取连接;关闭连接时,就是实实在在地关闭连接,释放资源。
连接池是在服务器上创建一个连接池,预先建立一些数据库连接,放在连接池中,调用 getConnection() 获取连接时,只是从连接池中取出一个连接,调用close()关闭连接时,并不是真的关闭连接,是由连接池回收连接,下次还可以接着用。创建数据库连接是很花时间的,使用连接池减少了时间开销。
数据源适合需要多次创建数据库连接的应用,如果不使用数据源,一个一个地DriverManager.getConnection(url, user, password);传入url、user、password创建连接,很麻烦。
连接池数据源适合需要创建多个连接的应用。
DBCP数据源
DBCP是Apache的一个开源项目,Tomcat的连接池就是使用DBCP来实现的。
使用DBCP需要2个jar包:
- commons-dbcp2.jar dbcp的核心包,下载压缩包后里面有
- commons-pool2.jar dbcp的依赖,需要单独去下载
这2个都是在apache上下载,下载的时候要注意对应我们的JDK版本(实际上是对应JDK中JDBC的版本)。
此外,还需要2个额外的jar包:
- commons-logging.jar 日志包
- 数据库驱动
DBCP常用的数据源类是BasicDataSource。
//从properties文件加载数据源配置
Properties properties = new Properties();
InputStream is = Class.forName("test.Test").getResourceAsStream("/dataSource.properties");
properties.load(is);
String driverStr = properties.getProperty("driver");
String url=properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password"); //设置连接池
BasicDataSource dataSource = new BasicDataSource();
//这些第三方的数据源不知道我们使用的是何种数据库,所以要手动设置数据库驱动
dataSource.setDriverClassName(driverStr); //注意是setDriverClassName(),参数才是String
/*
也可以这样写:
java.sql.Driver driver = DriverManager.getDriver(driverStr);
dataSource.setDriver(driver); //参数是java.sql.Driver
Driver类在多个包下都有,注意不要写错了。
建议使用前一种,更简单,不容易出错。
*/
dataSource.setUrl(url);
dataSource.setUsername(username); //注意是setUsername(),不是setUser()
dataSource.setPassword(password); //从数据源获取连接获取连接,操作数据库
Connection connection = dataSource.getConnection();
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"chy");
ps.setInt(2,20);
ps.setInt(3,99);
ps.executeUpdate();
connection.close();
可以通过工厂来创建数据源:
BasicDataSource dataSource= BasicDataSourceFactory.createDataSource(properties); //参数是Properties类型
十分简便,但对properties中的key有严格要求,比如说:
setUsername() => 去掉set,后面部分变为camel写法,username。
如果key写错了,比如写成了user,会报错: Access denied for user ''@'localhost' (using password: YES) ,有时候报的是NO。
可以给数据源设置一些其他参数,比如:
dataSource.setInitialSize(5); //设置初始连接数,初始化连接池时会创建5个连接,放到连接池中
dataSource.setMinIdle(2); //设置最小空闲连接数,连接池中至少有2个连接是空闲的。idle,闲置的、无所事事。
dataSource.setMaxTotal(20); //设置最大连接数,连接池中最多可以有20个连接
//......
使用properties文件直接配置DBCP数据源
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
username=chy
password=abcd
minIdle=2
maxIdle=10
initialSize=15
maxTotal=30
//从properties文件加载数据源配置
Properties properties = new Properties();
InputStream is = Class.forName("test.Test").getResourceAsStream("/dataSource.properties");
properties.load(is); //设置连接池
BasicDataSource dataSource= BasicDataSourceFactory.createDataSource(properties);
//从数据源获取连接获取连接,操作数据库
Connection connection = dataSource.getConnection();
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"chy");
ps.setInt(2,20);
ps.setInt(3,99);
ps.executeUpdate();
connection.close();
数据库驱动自带的数据源、c3p0直接使用properties文件配置,很容易出错,不推荐。
dbcp可以直接使用properties文件配置,不容易出错。
C3P0数据源
C3P0是mchange的开源项目,相比于DBCP,C3P0有自动回收闲置连接的功能,性能更优。

下载,解压后lib文件夹下有3个jar包,把c3p0.jar、mchange-commons-java.jar这2个jar包添加到项目中,带oracle的那个是Oracel才用的。
把数据库驱动添加到项目中。
DBCP是Apache的,要添加自家的日志包commons-logging.jar,C3P0则不必添加日志包。
C3P0常用的数据源类是ComboPooledDataSource。
//从properties文件加载数据源配置
Properties properties = new Properties();
InputStream is = Class.forName("test.Test2").getResourceAsStream("/dataSource.properties");
properties.load(is);
String driver = properties.getProperty("driver");
String jdbcUrl=properties.getProperty("jdbcUrl");
String user = properties.getProperty("user");
String password = properties.getProperty("password"); //配置数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver); //只有这个方法,没有setDriver()
dataSource.setJdbcUrl(jdbcUrl); //注意是setJdbcUrl(),和其他数据源不同
dataSource.setUser(user);
dataSource.setPassword(password); //从数据源获取连接,操作数据库
Connection connection = dataSource.getConnection();
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"chy");
ps.setInt(2,20);
ps.setInt(3,99);
ps.executeUpdate();
connection.close();
相比于DBCP,C3P0可以设置更多的配置参数,比如:
dataSource.setMaxStatements(10);
dataSource.setMaxStatementsPerConnection(10);
这些配置一般不写死在程序中,而是写在配置文件中,从配置文件中加载配置。
DBCP不具备自动回收空闲连接的功能,C3P0具备。
Java JDBC 数据源的更多相关文章
- JDBC数据源(DataSource)数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。
JDBC数据源(DataSource)的简单实现 数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用. 2.数据源提供了一种简单获取数据库连接的方式,并能在内部通 ...
- Tomcat中使用JNDI加载JDBC数据源
以前写JDBC的时候总是手工写一个类,用硬代码写上className.url.用户名和密码什么的,然后通过DriverManager获取到Connection.那样写是很方便,但是如果想更改的话,需要 ...
- Java JDBC高级特性
1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现 ...
- JDBC数据源 使用JNDI连接池实现数据库的连接
0.引言 许多Web应用程序需要通过JDBC驱动程序访问数据库,以支持该应用程序所需的功能.Java EE平台规范要求Java EE应用程序服务器为此目的提供一个DataSource实现(即,用于JD ...
- [Java]jdbc[转]
>>http://www.cnblogs.com/xiohao/p/3507483.html >>http://www.cnblogs.com/hongten/archive/ ...
- JAVA JDBC(存储过程和事务管理)
1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...
- JDBC数据源连接池(4)---自定义数据源连接池
[续上文<JDBC数据源连接池(3)---Tomcat集成DBCP>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究 ...
- JDBC数据源连接池(3)---Tomcat集成DBCP
此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...
- JDBC数据源连接池(2)---C3P0
我们接着<JDBC数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3P0的j ...
随机推荐
- Java 静态、类加载
1.静态是什么?有什么用? static的主要作用在于创建独立于具体对象的域变量或者方法. 每创建一个对象,都会在堆里开辟内存,存成员(属性),但是不存方法,方法是共用的,没必要每一个对象都浪费内存去 ...
- RabbitMQ消息幂等性问题
文章目录 1. 什么是幂等性?1.1 消息队列的幂等性1.2 模拟重试机制1.2.1 生产者代码1.2.2 消费者代码1.2.3 消费者 application.yml 配置2. 如何保证消息幂等性, ...
- ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)
IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...
- iptables man手册翻译
概要 iptables [-t table] -[AD] chain rule-specification [options]iptables [-t table] -I chain [rulenum ...
- 2013(1)需求工程, 需求开发, 需求分析, 面向对象需求分析, UML,需求建模
案例一 某软件公司拟为物流企业开发一套库存管理系统,该系统的部分需求陈述如下: (1) 库存管理系统主要包括货物入库管理.货物出库管理.仓库管理.统计报表和系统管理等功能. (2) 库存管理系统的用户 ...
- Python基于tkinter.messagebox实现简易消息框、对话框
库导入: import tkinter import tkinter.messagebox 有关提示框: tkinter.messagebox.showinfo(title=None, message ...
- JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)
总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...
- centos里的压缩解压命令tar总结
压缩 tar czvf 压缩文件名称.tar.gz 文件或者目录名称 比如:tar czvf backup.tar.gz /etc,把/etc目录打包成文件backup.tar.gz c是打包 z是g ...
- Thrift源码分析(二)-- 协议和编解码
协议和编解码是一个网络应用程序的核心问题之一,客户端和服务器通过约定的协议来传输消息(数据),通过特定的格式来编解码字节流,并转化成业务消息,提供给上层框架调用. Thrift的协议比较简单,它把协议 ...
- python三级联动
#以字典的形式 保存相关省市数据 menu={ '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, 'HP':{}, '银行':{}, 'CCTV':{} }, '望京':{ '陌陌':{ ...