27、jdbc操作数据库(4)
數(shù)據(jù)庫連接池是什么?為什么使用連接池?
當(dāng)使用jdbc去操作數(shù)據(jù)庫時,需要先獲取連接,然后進行具體的數(shù)據(jù)庫操作,最后釋放連接。這一系列操作在演示一個demo時還可以使用,但是當(dāng)訪問數(shù)據(jù)庫次數(shù)多了的時候,就會顯得很繁瑣,除此之外還容易造成內(nèi)存泄漏、數(shù)據(jù)庫崩潰等復(fù)雜問題。所以為了解決這一問題,就出現(xiàn)了數(shù)據(jù)庫連接池,顧名思義就是使用一個盛有數(shù)據(jù)庫連接的池子來管理數(shù)據(jù)庫連接,連接池負責(zé)分配、管理和釋放數(shù)據(jù)庫連接,可以控制數(shù)據(jù)庫連接的個數(shù),其基本思想就是預(yù)先將一定數(shù)量的數(shù)據(jù)庫連接放到一個池子中,所謂的池子就是一塊緩沖區(qū),當(dāng)使用連接時直接去連接池中獲取即可,用完再放回到池子中,這樣直接從內(nèi)存中獲取而不需要重復(fù)操作數(shù)據(jù)庫,提高了效率和性能。
怎么使用連接池
java中提供了數(shù)據(jù)庫連接池對應(yīng)的接口:javax.sql.DataSource,對連接的管理都通過此接口對象實現(xiàn),一般需要第三方實現(xiàn)或者服務(wù)器提供實現(xiàn),這里介紹三種第三方提供的連接池,分別是:dbcp、c3p0、druid。連接池通常也被成為數(shù)據(jù)源,包含連接池和連接池管理兩部分,接下來詳細介紹一下怎么使用這三種連接池。
dbcp
首先需要添加第三方連接池的jar包:
commons-dbcp2-2.3.0.jar、commons-logging-1.2.jar、commons-pool2-2.5.0.jar
因為使用連接池管理連接,所以需要創(chuàng)建一個dbcp.properties用來配置連接數(shù)據(jù)庫的信息,使用org.apache.commons.dbcp2.BasicDataSourceFactory工廠類來創(chuàng)建一個數(shù)據(jù)源,然后使用提供的Datasource實現(xiàn)類org.apache.commons.dbcp2.BasicDataSource來獲取對應(yīng)的連接即可。在配置dbcp.properties時一定要注意,鍵的名稱必須和BasicDataSource類中定義的成員變量名稱一致,否則報錯。實例代碼如下:
//--------------------------dbcp.properties---------------------// driver=com.mysql.jdbc.Driver #jdbc:database://host:port/dbName url=jdbc:mysql://127.0.0.1:3306/fqx_webapp username=root password=123456 #這里只配置一下maxTotal參數(shù)作為實例,說明可以通過配置dbcp的參數(shù)來預(yù)定義連接池的各個屬性,參數(shù)可以參照org.apache.commons.dbcp2.BasicDataSource類中的成員變量 maxTotal=16//--------------------------代碼實現(xiàn)----------------------------// public static void main(String[] args) {Properties properties = new Properties();InputStream inStream = ConnectionPoolTest.class.getClassLoader().getResourceAsStream("dbcp.properties");// BasicDataSource類是dbcp提供的類,實現(xiàn)了javax.sql.DataSource接口BasicDataSource basicDataSource = null;try {properties.load(inStream);basicDataSource = BasicDataSourceFactory.createDataSource(properties);System.out.println(basicDataSource);//可以獲取和修改連接池的配置參數(shù)System.out.println(basicDataSource.getMaxTotal());//通過連接池獲取連接,用完無需釋放Connection connection = basicDataSource.getConnection();PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");ResultSet executeQuery = prepareStatement.executeQuery();while(executeQuery.next()){System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} }c3p0
首先需要添加第三方j(luò)ar包:
c3p0-0.9.5.3.jar、mchange-commons-java-0.2.15.jar
需要創(chuàng)建一個c3p0-config.xml用來配置連接數(shù)據(jù)庫的信息,然后使用提供的Datasource實現(xiàn)類com.mchange.v2.c3p0.ComboPooledDataSource來獲取對應(yīng)的連接池即可。
配置文件配置如下:
<?xml version="1.0" encoding="UTF-8" ?> <c3p0-config><default-config><property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/fqx_webapp</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="user">root</property><property name="password">123456</property><property name="acquireIncrement">5</property><property name="initialPoolSize">30</property><property name="maxPoolSize">30</property><property name="minPoolSize">1</property></default-config> </c3p0-config>實現(xiàn)代碼如下:
public static void main(String[] args) {try {//獲取數(shù)據(jù)源對象ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");Connection connection;//通過數(shù)據(jù)源獲取連接connection = dataSource.getConnection();System.out.println(connection);PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");ResultSet executeQuery = prepareStatement.executeQuery();while(executeQuery.next()){System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));}} catch (SQLException e) {e.printStackTrace();} }可通過c3p0 api 網(wǎng)址 https://www.mchange.com/projects/c3p0 進一步了解c3p0.
當(dāng)連接獲取失敗時,c3p0具有重連機制,這一點比較誘人。
druid
首先需要添加第三方j(luò)ar包:druid-1.1.10.jar
需要創(chuàng)建一個druid.properties用來配置連接數(shù)據(jù)庫的信息,使用com.alibaba.druid.pool.DruidDataSourceFactory工廠類來創(chuàng)建一個數(shù)據(jù)源,然后使用提供的Datasource實現(xiàn)類com.alibaba.druid.pool.DruidDataSource來獲取對應(yīng)的連接即可。在配置druid.properties時一定要注意,鍵的名稱必須和com.alibaba.druid.pool.DruidDataSourceFactory類中對應(yīng)的常量值一致。實例代碼如下:
//-------------druid.properties--------------------// druid.driverClassName=com.mysql.jdbc.Driver druid.url=jdbc:mysql://127.0.0.1:3306/fqx_webapp druid.username=root druid.password=123456//--------------實現(xiàn)代碼----------------------// public static void main(String[] args) {try {Properties properties = new Properties();InputStream inStream = ConnectionPoolTest.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(inStream);//獲取數(shù)據(jù)源對象DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection;//通過數(shù)據(jù)源獲取連接connection = dataSource.getConnection();System.out.println("druid-->"+connection);PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");ResultSet executeQuery = prepareStatement.executeQuery();while(executeQuery.next()){System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));}} catch (SQLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} }druid集合了眾家所長,號稱是當(dāng)前最好的數(shù)據(jù)庫連接池,對數(shù)據(jù)庫連接和sql的執(zhí)行可以進行最大程度上的監(jiān)控,這一點比較誘人。
總結(jié)
以上是生活随笔為你收集整理的27、jdbc操作数据库(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国标通 App 上线,可查询标准信息、公
- 下一篇: 28、jdbc操作数据库(5)