5.数据库连接池
- 池化技术:准备一下预先的资源,供连接,原因是连接-释放浪费系统资源
- 最小连接数
- 最大连接数
- 等待超时
- 编写连接池,实现一个接口javax.sql.DataSource
开源数据源实现(直接用,jar包中已实现)
DBCP
C3P0
Druid:阿里,有监控,配置为顶配是速度慢下来
- 使用了这些DB连接池,不需要编写连接数据库代码
5.1 DBCP
- 需要commons-dbcp-1.4.jar、commons-pool-1.6.jar包
#连接设置 name是dbcp设置好的,供dbcp读取
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=root
password=123456
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
maxWait=60000
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED
private static DataSource dataSource = null;
static {
//db.properties配置文件放在src目录,可以直接读取到
//若放在项目包目录下,需要加路径
try {
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties properties = new Properties();
properties.load(in);
//创建数据源--通过工厂模式
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection(); //从数据源获取链接
}
public static void close(Connection connection, Statement statement, ResultSet resultSet){
//按顺序释放
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
5.2 C3P0
- 需要c3p0-0.9.5.5.jar/mchange-commons-java-0.2.20.jar
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--c3p0的缺省(默认)配置如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource();"这样写就表示使用的是c3p0的缺省(默认)-->
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&uesSSL=false&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
<!--c3p0的配置如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource("mysql");"这样写就表示使用的是c3p0的mysql配置的数据库-->
<name-config name="mysql">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&uesSSL=false&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<!--获得增量-->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</name-config>
</c3p0-config>
public class JdbcUtils_Dbcp {
private static DataSource dataSource = null;
static {
//db.properties配置文件放在src目录,可以直接读取到
//若放在项目包目录下,需要加路径
try {
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties properties = new Properties();
properties.load(in);
//创建数据源--通过工厂模式
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection(); //从数据源获取链接
}
public static void close(Connection connection, Statement statement, ResultSet resultSet){
//按顺序释放
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
private static void insertMethod() {
Connection connection = null;
PreparedStatement pstm = null;
ResultSet resultSet = null;
try {
connection = JdbcUtils_c3p0.getConnection();
//关闭数据库自动提交,自动会开启事务
connection.setAutoCommit(false); //开启事务
//区别
//使用?作为占位符
String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
//先写下面这个预编译的方法,上面的sql会提示
pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
pstm.setString(1,"华安");
pstm.setString(2,"9527");
pstm.setString(3,"123456789@163.com");
//注意:sql.date 数据库支持的 java.sql.Date
// util.Date java new.Date.gettime() 获得时间戳
pstm.setDate(4,new Date(System.currentTimeMillis()));
boolean flag = pstm.execute(); //返回ResultSet为true,否则相反
//业务完毕提交事务
connection.commit();
int num = pstm.executeUpdate(); //受影响行数
if(num>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
try {
//不写也会回滚
connection.rollback(); //如果失败就回滚
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JdbcUtils_c3p0.close(connection,pstm,resultSet);
}
}
- 其他数据源,本质是一样的,DataSource接口不变,dataSource.getConnection()方法就不变
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123957.html