首页 > 数据库 >51 | JAVA_数据库JDBC_连接池

51 | JAVA_数据库JDBC_连接池

时间:2022-09-05 20:02:56浏览次数:93  
标签:JDBC JAVA 51 ds Connection config 连接 连接池

JDBC连接池

类似的,在执行JDBC的增删改查的操作时,如果每一次操作都来一次打开连接,操作,关闭连接,那么创建和销毁JDBC连接的开销就太大了。为了避免频繁地创建和销毁JDBC连接,我们可以通过连接池(Connection Pool)复用已经创建好的连接。

JDBC连接池有一个标准的接口javax.sql.DataSource,注意这个类位于Java标准库中,但仅仅是接口。要使用JDBC连接池,我们必须选择一个JDBC连接池的实现。常用的JDBC连接池有:

  • HikariCP
  • C3P0
  • BoneCP
  • Druid

目前使用最广泛的是HikariCP。我们以HikariCP为例,要使用JDBC连接池,先添加HikariCP的依赖如下:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.7.1</version>
</dependency>

紧接着,我们需要创建一个DataSource实例,这个实例就是连接池:

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("password");
config.addDataSourceProperty("connectionTimeout", "1000"); // 连接超时:1秒
config.addDataSourceProperty("idleTimeout", "60000"); // 空闲超时:60秒
config.addDataSourceProperty("maximumPoolSize", "10"); // 最大连接数:10
DataSource ds = new HikariDataSource(config);

注意创建DataSource也是一个非常昂贵的操作,所以通常DataSource实例总是作为一个全局变量存储,并贯穿整个应用程序的生命周期。

有了连接池以后,我们如何使用它呢?和前面的代码类似,只是获取Connection时,把DriverManage.getConnection()改为ds.getConnection()

try (Connection conn = ds.getConnection()) { // 在此获取连接
    ...
} // 在此“关闭”连接

通过连接池获取连接时,并不需要指定JDBC的相关URL、用户名、口令等信息,因为这些信息已经存储在连接池内部了(创建HikariDataSource时传入的HikariConfig持有这些信息)。一开始,连接池内部并没有连接,所以,第一次调用ds.getConnection(),会迫使连接池内部先创建一个Connection,再返回给客户端使用。当我们调用conn.close()方法时(在try(resource){...}结束处),不是真正“关闭”连接,而是释放到连接池中,以便下次获取连接时能直接返回。

因此,连接池内部维护了若干个Connection实例,如果调用ds.getConnection(),就选择一个空闲连接,并标记它为“正在使用”然后返回,如果对Connection调用close(),那么就把连接再次标记为“空闲”从而等待下次调用。这样一来,我们就通过连接池维护了少量连接,但可以频繁地执行大量的SQL语句。

通常连接池提供了大量的参数可以配置,例如,维护的最小、最大活动连接数,指定一个连接在空闲一段时间后自动关闭等,需要根据应用程序的负载合理地配置这些参数。此外,大多数连接池都提供了详细的实时状态以便进行监控。

标签:JDBC,JAVA,51,ds,Connection,config,连接,连接池
From: https://www.cnblogs.com/mmxingye/p/16659367.html

相关文章

  • 53 | JAVA_TCP编程
    TCP编程使用Socket进行网络编程时,本质上就是两个进程之间的网络通信。其中一个进程必须充当服务器端,它会主动监听某个指定的端口,另一个进程必须充当客户端,它必须主动连接......
  • 52 | JAVA_网络编程基础
    网络编程基础ip地址在互联网中,一个IP地址用于唯一标识一个网络接口(NetworkInterface)。一台联入互联网的计算机肯定有一个IP地址,但也可能有多个IP地址。IP地址又......
  • 54 | JAVA_UDP编程
    UDP编程和TCP编程相比,UDP编程就简单得多,因为UDP没有创建连接,数据包也是一次收发一个,所以没有流的概念。在Java中使用UDP编程,仍然需要使用Socket,因为应用程序在使用UDP时......
  • 2022-09-03 第二小组 张晟源(JAVAWebMVC)
    JAVAWeb一,MVC架构是一种软件架构模式,把整个软件分为三层:Model,view,controllerModel:模型---获取数据,并处理,返回给controller  entity:数据库实体类User---user表 ......
  • 55 | JAVA_HTTP编程
    HTTP编程基础知识什么是HTTP?HTTP就是目前使用最广泛的Web应用程序使用的基础协议,例如,浏览器访问网站,手机App访问后台服务器,都是通过HTTP协议实现的。一个完整的HTTP请求......
  • 56 | JAVA_编写HTTPserver
    编写HTTPServer我们来看一下如何编写HTTPServer。一个HTTPServer本质上是一个TCP服务器,我们先用TCP编程的多线程实现的服务器端框架:publicclassServer{public......
  • 44 | JAVA_IO_Writer(和Reader对应)
    Writer(和Reader对应)Reader是带编码转换器的InputStream,它把byte转换为char,而Writer就是带编码转换器的OutputStream,它把char转换为byte并输出。Writer和OutputStream的......
  • 43 | JAVA_IO_Reader(一种接口,字符流)
    Reader(一种接口,字符流)Reader是Java的IO库提供的另一个输入流接口。和InputStream的区别是,InputStream是一个字节流,即以byte为单位读取,而Reader是一个字符流,即以char为单......
  • 45 | JAVA_IO_ PrintStream 和 PrintWriter
    PrintStream和PrintWriterPrintStream(写到字节流)PrintStream是一种FilterOutputStream,它在OutputStream的接口上,额外提供了一些写入各种数据类型的方法:写入int:prin......
  • 46 | JAVA_IO_使用Files
    使用Files虽然Files是java.nio包里面的类,但他俩封装了很多读写文件的简单方法,例如,我们要把一个文件的全部内容读取为一个byte[],可以这么写:byte[]data=Files.readAllBy......