java---連接池的學習

/** ####################################數據庫的連接池學習#################################    * * * #####數據庫連接池
>1. 數據庫的連接對象創建工作,比較消耗性能。 >2.一開始現在內存中開辟一塊空間(集合) , 一開先往池子里面放置 多個連接對象。  
后面需要連接的話,直接從池子里面去。不要去自己創建連接了。  
使用完畢, 要記得歸還連接。確保連接對象能循環利用。
![icon](img/img11.png)###自定義數據庫連接池 * 代碼實現* 出現的問題:1. 需要額外記住 addBack方法2. 單例。3. 無法面向接口編程。 UserDao dao = new UserDaoImpl();dao.insert();DataSource dataSource = new MyDataSource();因為接口里面沒有定義addBack方法。 4. 怎么解決?   以addBack 為切入點。###解決自定義數據庫連接池出現的問題。 > 由于多了一個addBack 方法,所以使用這個連接池的地方,需要額外記住這個方法,并且還不能面向接口編程。> 我們打算修改接口中的那個close方法。  原來的Connection對象的close方法,是真的關閉連接。 
> 打算修改這個close方法,以后在調用close, 并不是真的關閉,而是歸還連接對象。* * * ####開源連接池#### DBCP
1. 導入jar文件
2. 不使用配置文件* public void testDBCP01(){Connection conn = null;PreparedStatement ps = null;try {//1. 構建數據源對象BasicDataSource dataSource = new BasicDataSource();//連的是什么類型的數據庫, 訪問的是哪個數據庫 , 用戶名, 密碼。。//jdbc:mysql://localhost/bank 主協議:子協議 ://本地/數據庫dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost/bank");dataSource.setUsername("root");dataSource.setPassword("root");//2. 得到連接對象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "admin");ps.setInt(2, 1000);ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}}* * * ####使用配置文件方式:Connection conn = null;PreparedStatement ps = null;try {BasicDataSourceFactory factory = new BasicDataSourceFactory();Properties properties = new Properties();InputStream is = new FileInputStream("src//dbcpconfig.properties");properties.load(is);DataSource dataSource = factory.createDataSource(properties);//2. 得到連接對象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "liangchaowei");ps.setInt(2, 100);ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}* *###################配置文件模板##################################################*#連接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bank
username=root
password=root#<!-- 初始化連接 -->
initialSize=10#最大連接數量
maxActive=50#<!-- 最大空閑連接 -->
maxIdle=20#<!-- 最小空閑連接 -->
minIdle=5#<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等于60秒 -->
maxWait=60000#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;] 
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這里不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED########################################################################################* * ####################C3P0知識點##################################################################C3P0
> 拷貝jar文件 到 lib目錄###不使用配置文件方式Connection conn = null;PreparedStatement ps = null;try {//1. 創建datasourceComboPooledDataSource dataSource = new ComboPooledDataSource();//2. 設置連接數據的信息dataSource.setDriverClass("com.mysql.jdbc.Driver");//忘記了---> 去以前的代碼 ---> jdbc的文檔dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");dataSource.setUser("root");dataSource.setPassword("root");//2. 得到連接對象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "admi234n");ps.setInt(2, 103200);ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}######使用配置文件方式#####c3p0-config配置文件,xml文件。名字不可以改變<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><!-- default-config 默認的配置,  --><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost/bank</property><property name="user">root</property><property name="password">root</property><property name="initialPoolSize">10</property><property name="maxIdleTime">30</property><property name="maxPoolSize">100</property><property name="minPoolSize">10</property><property name="maxStatements">200</property></default-config><!-- This app is massive! --><named-config name="oracle"> <property name="acquireIncrement">50</property><property name="initialPoolSize">100</property><property name="minPoolSize">50</property><property name="maxPoolSize">1000</property><!-- intergalactoApp adopts a different approach to configuring statement caching --><property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property><!-- he's important, but there's only one of him --><user-overrides user="master-of-the-universe"> <property name="acquireIncrement">1</property><property name="initialPoolSize">1</property><property name="minPoolSize">1</property><property name="maxPoolSize">5</property><property name="maxStatementsPerConnection">50</property></user-overrides></named-config></c3p0-config>#####代碼部分//默認會找 xml 中的 default-config 分支。 
public class C3P0Demo02 {@Testpublic void testC3P0(){Connection conn = null;PreparedStatement ps = null;try {//就new了一個對象。在這種情況下c3p0會直接找到c3p0-config.xml文件//并且在c3p0-config.xml文件中默認的找到 default-config配置ComboPooledDataSource dataSource = new ComboPooledDataSource();//ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");//找到c3p0-config.xml文件中默認的找到named-config name="oracle"的配置//2. 得到連接對象conn = dataSource.getConnection();String sql = "insert into account values(null , ? , ?)";ps = conn.prepareStatement(sql);ps.setString(1, "wangwu2");ps.setInt(2, 2600);ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JDBCUtil.release(conn, ps);}}
}###########################################################################################* ###########DBUtils###增刪改
//dbutils 只是幫我們簡化了CRUD 的代碼, 但是連接的創建以及獲取工作。 不在他的考慮范圍QueryRunner主要是這個類QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());//增加
//queryRunner.update("insert into account values (null , ? , ? )", "aa" ,1000);//刪除
//queryRunner.update("delete from account where id = ?", 5);//更新
//queryRunner.update("update account set money = ? where id = ?", 10000000 , 6);* * * * * * ######查詢
1. 直接new接口的匿名實現類QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());Account  account =  queryRunner.query("select * from account where id = ?", new ResultSetHandler<Account>(){@Overridepublic Account handle(ResultSet rs) throws SQLException {Account account  =  new Account();while(rs.next()){String name = rs.getString("name");int money = rs.getInt("money");account.setName(name);account.setMoney(money);}return account;}}, 6);System.out.println(account.toString());2. 直接使用框架已經寫好的實現類。
* 查詢單個對象QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());//查詢單個對象Account account = queryRunner.query("select * from account where id = ?", new BeanHandler<Account>(Account.class), 8);* 查詢多個對象QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());List<Account> list = queryRunner.query("select * from account ",new BeanListHandler<Account>(Account.class));######ResultSetHandler 常用的實現類(重點)
以下兩個是使用頻率最高的BeanHandler,  查詢到的單個數據封裝成一個對象BeanListHandler, 查詢到的多個數據封裝 成一個List<對象>------------------------------------------ArrayHandler,  查詢到的單個數據封裝成一個數組ArrayListHandler,  查詢到的多個數據封裝成一個集合 ,集合里面的元素是數組。 MapHandler,  查詢到的單個數據封裝成一個mapMapListHandler,查詢到的多個數據封裝成一個集合 ,集合里面的元素是map。 ColumnListHandler
KeyedHandler
ScalarHandler##數據連接池* DBCP不使用配置使用配置* C3P0不使用配置使用配置 (必須掌握)* 自定義連接池 裝飾者模式##DBUtils> 簡化了我們的CRUD , 里面定義了通用的CRUD方法。 queryRunner.update();queryRunner.query* * * * * */

?

轉載于:https://www.cnblogs.com/byczyz/p/11343575.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386204.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里P8親自講解!成功入職頭條月薪35K

前言 又到一年金九銀十之際。 Java作為目前用戶最多&#xff0c;使用范圍最廣的軟件開發技術之一。 Java的技術體系主要由支撐Java程序運行的虛擬機&#xff0c;提供各開發領域接口支持的Java,Java編程語言及許多第三方Jvav框架構成。 其中&#xff0c;以Java的虛擬器為今天的著…

java----連接池C3p0使用的補充

C3p0數據庫的連接方式是目前市場場最為廣泛的類型之一 本篇主要你演示C3p0使用文件配置和不使用文件配置的兩種操作方式 #######使用文件配置 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;import com.dbutil.zyz.ConnLink; …

阿里P8大佬親自教你!java程序設計第四版pdf

前言 最近有很多朋友去目前主流的大型互聯網公司面試&#xff08;阿里巴巴、京東、字節跳動、螞蟻金服、滴滴&#xff09;&#xff0c;面試回來之后會發給我一些面試題。有些朋友輕松過關&#xff0c;拿到offer&#xff0c;但是有一些是來詢問我答案的。 我特意整理了一下&am…

阿里P8大佬親自講解!朝陽java培訓

開頭 Spring框架自誕生以來一直備受開發者青睞&#xff0c;有人親切的稱之為&#xff1a;Spring 全家桶。Spring更是避免了重復造輪子的工作并跟隨著互聯網行業的發展做出不斷的更新&#xff0c;很多研發人員把spring看作心目中最好的Java項目&#xff0c;沒有之一。 **可以毫…

分隔符的作用和用法

一、插入分頁符 當文本或圖形等內容填滿一頁時&#xff0c;Word會插入一個自動分頁符并開始新的一頁。如果要在某個特定位置強制分頁&#xff0c;可插入“手動”分頁符&#xff0c;這樣可以確保章節標題總在新的一頁開始。首先&#xff0c;將插入點置于要插入分頁符的位置&…

java----DBUtils知識點補充

dbutils 只是幫我們簡化了CRUD 的代碼&#xff0c; 但是連接的創建以及獲取工作。 不在他的考慮范圍 QueryRunner主要是這個類 import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;import com.mchange.v2.c3p0.ComboPooledDataSource;public class D…

大廠offer手到擒來,Java面試真題精選

前言 事務我們都知道是什么&#xff0c;而Spring事務就是在數據庫之上利用AOP提供聲明式事務和編程式事務幫助我們簡化開發&#xff0c;解耦業務邏輯和系統邏輯。但是Spring事務原理是怎樣&#xff1f;事務在方法間是如何傳播的&#xff1f;為什么有時候事務會失效&#xff1f…

大廠也在用的6種數據脫敏方案,醍醐灌頂!

前言 由于作者面試過程中高度緊張&#xff0c;本文中只列出了自己還記得的部分題目。 經歷了漫長一個月的等待&#xff0c;終于在前幾天通過面試官獲悉已被螞蟻金服錄取&#xff0c;這期間的焦慮、痛苦自不必說&#xff0c;知道被錄取的那一刻&#xff0c;一整年的陰霾都一掃…

大牛帶你直擊優秀開源框架靈魂,給大家安排上!

前言 微架構的出現&#xff0c;很好地適應了這個時代對快速發展變化的要求。它不再提倡一體化的項目設計&#xff0c;而是對項目進行有效的“業務區”(可以簡單理解為不同的子系統〉劃分&#xff0c;并利用合理的技術對業務性能做出提升和改善&#xff0c;同時又極大地簡化了配…

大牛用SSM框架實現了支付寶的支付功能,滿滿干貨指導

前言 現在刷抖音經常可以看到一些老外街坊&#xff0c;問他們最想把什么帶回自己的國家&#xff0c;我聽過很多的回答都是&#xff1a;淘寶&#xff0c;支付寶&#xff0c;美食&#xff0c;微信&#xff0c;外賣&#xff0c;高鐵等等。 確實如此&#xff0c;隨著國家的快速發…

java---Listener Filter知識點學習

##Listener > 監聽器 * 能做什么事&#xff1f; > 監聽某一個事件的發生。 狀態的改變。 * 監聽器的內部機制 > 其實就是接口回調. ####接口回調 * 需求&#xff1a; > A在執行循環&#xff0c;當循環到5的時候&#xff0c; 通知B。 > 事先先把一個對象傳遞給 …

頭條三面技術四面HR,就是這么簡單

前言 看日期&#xff0c;今天都是4月了&#xff0c;這春招也差不多進入尾聲了。 近期任有不少朋友都在找工作&#xff0c;很多人開始抱怨&#xff0c;工作可真難找啊&#xff01;身邊不少朋友問我咋搞呀&#xff0c;秋招都要結束了&#xff0c;工作還沒著落呢…額…這個…今年…

臨時表

tmp_table_size 這個配置限制了內存臨時表的大小&#xff0c;默認值是 16M。 如果臨時表大小超過了 tmp_table_size&#xff0c;那么內存臨時表就會轉成磁盤臨時表 磁盤臨時表使用的引擎默認是 InnoDB&#xff0c;是由參數 internal_tmp_disk_storage_engine 控制的。 轉載于:h…

如何保證Redis與數據庫的雙寫一致性?進階加薪全靠它!

我有話要說&#xff0c;請仔細看完 我發現一個現象&#xff0c;很多開發5年的程序員仍然停留在crud的階段&#xff0c;這是什么原因&#xff1f; 最主要的原因就是基礎很差&#xff0c;尤其對于JVM和并發編程這方面掌握的比較差&#xff0c;而JVM和并發編程就是非常非常重要的…

Swimming Balls

Swimming Balls https://vjudge.net/contest/318752#problem/J如果直接算&#xff0c;各種球的情況都不清楚&#xff0c;因為放一個球之后&#xff0c;水位的變化也會影響之前放入的球&#xff0c;不如&#xff0c;二分最終的水位高度&#xff0c;這樣每個球的貢獻就有了 #incl…

如何保證redis高可用?薪資翻倍

前言&#xff1a; 首先介紹一下我的同學&#xff0c;專科畢業應用電子技術專業&#xff0c;已經畢業快兩年了。因為專業的原因工作一年覺得沒什么發展前途就想轉行&#xff0c;身為他的“好基友”&#xff0c;他覺得我這個工作挺好的&#xff0c;就咨詢了我一下&#xff0c;經…

Linux中強大的輸入輸出重定向和管道

Linux中有三個最重要的輸入輸出流: Standard Input(STDIN) - 通常指鍵盤的輸入 Standard Output(STDOUT) - 通常指顯示器的輸出 Standard Error(STDERR) - 通常也是重定向到顯示器 默認情況下&#xff0c;分別是0表示標準輸入(stdin),1表示標準輸出(stdout),2表示標準錯誤。 參…

如何保證消息隊列的高可用?透徹分析源碼

前言 成為優秀的架構師是大部分初中級工程師的階段性目標。優秀的架構師往往具備七種核心能力&#xff1a;編程能力、調試能力、編譯部署能力、性能優化能力、業務架構能力、在線運維能力、項目管理能力和規劃能力。 這幾種能力之間的關系大概如下圖。編程能力、調試能力和編…

rails 放在 apache一個目錄下面的配置方法

<Location /redmine> ProxyPass http://localhost:3000 ProxyPassReverse http://localhost:3000/</Location>然后&#xff0c;配置additional_environment.rb文件中config.action_controller.relative_url_root /redmine這樣基本就可以了&#xff0c;但是&…

如何化身BAT面試收割機?不吃透都對不起自己

前言 多線程相對于其他 Java 知識點來講&#xff0c;有一定的學習門檻&#xff0c;并且了解起來比較費勁。在平時工作中如若使用不當會出現數據錯亂、執行效率低&#xff08;還不如單線程去運行&#xff09;或者死鎖程序掛掉等等問題&#xff0c;所以掌握了解多線程至關重要。…