資料庫表池
A. 如何在NetBeans中設置資料庫連接池
以往要設置資料庫連接池,需要藉助於第三方軟體。但現在NetBeans所帶的Tomcat 5.5.7及Sun Application Server 8均可以直接設置。下面談談如何在Tomcat 5.5.7下設置。
1. 下載資料庫的專用連接驅動,並將其復制到C:Program Filesetbeans-4.1entERPrise1jakarta-tomcat-5.5.7commonlib文件夾下面。
假設所用資料庫是Sybase的Adaptive Server Anywhere,從Sybase官方站點下載JConnect-6_0,從中抽取出jconn3這個驅動,復制到上述文件夾下。
2. 啟動Tomcat,在IE輸入http://localhost:8084/admin/,以管理員身份登錄管理。用戶登錄的方法可參考第5樓。點擊Resources下的Data Sources,在右邊Data Source Actions的下拉框中選Create New Data Source,按下表示範填寫:
JNDI Name: sybase/poolDB /* 根據喜好填 */
Data Source URL: JDBC:sybase:Tds:<localhost>:<埠號>
/* 資料庫的地址,此為jconn3的形式,埠號需查詢確認,但一般都是固定的,除非自己更改 */
JDBC Driver Class: com.sybase.jdbc3.jdbc.SybDriver /* jconn3的驅動 */
User Name: dba/* 用戶名,默認為dba */
Password: *** /* 密碼,默認為sql */
Max. Active Connections: 4/* 最大活動連接數 */
Max. Ide Connections: 2 /* 最大空閑連接數 */
Max. Wait for Connecton: 5000 /* 等待連接的最大秒數 */
Validation Query: /* 驗證字元串,可不填 */
按"Save",再按"Commit Changes",Tomcat在後台將此變化保存到server.XML文件中。"Commit Changes"是最容易忘記的,小心。
3. 以下均轉入NetBeans環境中設置。在context.xml修改的內容:
<Context path="/Matrix">
<ResourceLink global="sybase/poolDB" name="sybase/poolDB" type="javax.sql.DataSource"/>
</Context>
"/Matrix"為此Web應用的根地址,表現為http://localhost:8084/Matrix。
4. 在web.xml中加入:
<resource-ref>
<description>Sybase Database Connection Pool</description>
<res-ref-name>sybase/poolDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
5. 好了,可以使用連接池了。以下代碼為在JSP文件中使用JSTL標簽庫的範例。
<sql:query var="queryresults" dataSource="sybase/poolDB">
SELECT * FROM customer
</sql:query>
B. Mysql資料庫InnoDB緩沖池(Buffer Pool)
1.InnoDB緩沖池簡介 InnoDB在內存中維護一個叫做緩沖池的存儲區域來緩存數據和索引。了解InnoDB緩沖區如何工作,如何利用它來在內存中保存被頻繁訪問的數據,對Mysql調優至關重要。可以通過對InnoDB緩沖的各方面進行配置來改善Mysql的性能。理想情況下,可以將緩沖池設置為實際需要的值,為伺服器上運行的其他進程保留足夠內存以防發生過度交換。緩沖池越大,InnoDB就越像一個內存庫,從磁碟上讀取一次數據,後續只從內存中讀取數據。大內存64位系統,可以把緩沖池分為多個部分,以便最小化並發操作時對內存結構的沖突。盡管會突然增加類似備份或報表類的活動,但依然可以將頻繁訪問的數據保存在內存中。預期不久將需要某些數據頁,則可以控制InnoDB將數據頁預先非同步讀入緩沖池的時間和方式。可以控制後台進程何時將臟頁刷出到磁碟,以及InnoDB是否基於工作負載動態調整刷出臟頁的頻率。可以配置InnoDB保留當前的緩沖池狀態,以避免伺服器重啟後發生過長的溫啟動時間。也可以在伺服器運行時保存當前的緩沖池狀態。
2.Innodb緩沖池LRU演算法 Innodb將緩沖池作為鏈表並通過最近最少使用(LRU)的變種演算法進行管理。當需要為緩沖池增加新頁時,InnoDB對最近最少使用的頁進行驅逐,並將新頁增加到鏈表的中部。這種「中間點插入策略」將鏈表看做兩個子鏈表:鏈表頭部為最近被存取過的「新」(或「年輕」)頁的子鏈表,鏈表尾部為最近較少被存取的「舊」頁的子鏈表。這個演算法把經常被查詢使用的頁保持在新的子鏈表中。舊的子鏈表則包含較少用到的頁;這些頁是將來被驅逐的候選頁。LRU演算法默認操作如下:緩沖池的3/8用作舊的子鏈表。鏈表中點是新的子鏈表尾部與舊的子鏈表頭部銜接的邊界。當InnoDB往緩沖池讀入一個頁時,會將該頁插入到鏈表的中點(舊的子鏈表的頭部)。當用戶進行類似查詢的特定操作需要數據頁或InnoDB進行預讀操作時,InnoDB會將其讀入緩沖池。存取舊的子鏈表中的頁會使其變得「年輕」,因為會將其移向緩沖池的頭部(新的子鏈表的頭部)。如果因為需要而將一個頁讀入緩沖池,則立即發生首次讀取並使其變得年輕。如果因為預讀而將一個頁讀入緩沖池,則並不立即發生首次存取(也許在該頁被驅逐前根本就不會被讀取)。隨著資料庫操作的進行,緩沖池中未被存取的頁通過移向鏈表尾部而變老。其他也變新的同時,新舊子鏈表中的頁變老。隨著頁被插入鏈表中點,舊子鏈表中的頁也會變老。最終,長時間未被使用的頁會到達舊子鏈表尾部而被驅逐。默認的,查詢讀取的頁會立即移到新子鏈表,這意味著它們將會更長時間留在緩沖池中。表掃描(像mysqlmp操作或沒有where子句的select語句引發的)能將大量數據帶入緩沖池,並驅逐同等數量的舊數據,即使新數據還從未用過。類似的,被後台進程預讀載入的頁,接著僅被存取一次就移到新鏈表的頭部。這些情況會頻繁的將被用過的頁推到舊子鏈表,從而將被驅逐。InnoDB標准監視輸出在屬於緩沖池LRU演算法的BUFFER POOL AND MEMORY部分包含幾個域。
3.InnoDB緩沖池配置選項 有幾個配置選項會影響InnoDB緩沖池的不同方面。innodb_buffer_pool_size:確定緩沖池的大小。innodb_buffer_pool_chunk_size:定義InnoDB緩沖池改變大小時的塊(chunk)大小。innodb_buffer_pool_instances:將緩沖池分為用戶指定數目的獨立區,每個有自己的LRU鏈表和相關的數據結構,以減少並發內存讀寫期間的沖突。innodb_old_blocks_pct:為用作舊子鏈表的緩沖池指定一個近似比例。innodb_old_blocks_time:指定首次訪問後插入舊子鏈表的頁,至少在舊子鏈錶停留多少毫秒才能被移入新子鏈表。innodb_read_ahead_threshold:控制InnoDB將頁預讀進緩沖池的線性預讀的靈敏度。innodb_random_read_ahead:開啟將頁預讀進緩沖池的隨機預讀技術。innodb_adaptive_flushing:確定是否基於工作負載動態調整緩沖池中臟頁的刷出率。innodb_flush_neighbors:確定從緩沖池刷出頁時是否也刷出同一個范圍內的其他臟頁。innodb_flushing_avg_loops:InnoDB保持先前計算的刷出狀態快照的迭代次數,用於控制針對負載變化自適應刷出的反應速度。innodb_lru_scan_depth:影響緩沖池刷出操作的演算法和試探法的一個參數。主要用於性能專家對I/O密集的負載進行調試。innodb_max_dirty_pages_pct:InnoDB盡力從緩沖中刷出數據以便臟頁的百分比不超過該值。innodb_max_dirty_pages_pct_lwm:開啟預刷出控制臟頁率時表示臟頁百分比的低水位線。innodb_buffer_pool_filename:指定一個用於保存innodb_buffer_pool_mp_at_shutdown或innodb_buffer_pool_mp_now產生的表空間ID和頁ID列表的文件名。innodb_buffer_pool_mp_at_shutdown:為了縮短下次重啟時溫啟動過程的耗時,指定mysql伺服器關閉時是否記錄緩沖池中緩沖的頁。innodb_buffer_pool_load_at_startup:指定在mysql伺服器啟動時通過載入較早時間緩沖的相同頁來自動進行緩沖池熱身。innodb_buffer_pool_mp_now:立即記錄緩沖池中緩沖的頁。innodb_buffer_pool_load_now:通過載入一套數據頁來立刻進行緩沖池熱身,而非等待伺服器重啟。innodb_buffer_pool_mp_pct:指定每個緩沖池中讀出和導出的最近被使用頁的百分比。innodb_buffer_pool_load_abort:中斷innodb_buffer_pool_load_at_startup或innodb_buffer_pool_load_now觸發的緩沖池內容恢復進程。
C. Java資料庫連接池的幾種配置方法(以MySQL數
連接先建立一些連接,並且這些連接允許共享,因此這樣就節省了每次連接的時間開銷。Mysql資料庫為例,連接池在Tomcat中的配置與使用。
1、創建資料庫Student,表student
2、配置server.xml文件。Tomcat安裝目錄下conf中server.xml文件。
<GlobalNamingResources>
<Resource
name="jdbc/DBPool"
type="javax.sql.DataSource"
password=""
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/student"
maxActive="3"
/>
</GlobalNamingResources>
name:指定連接池的名稱
type:指定連接池的類,他負責連接池的事務處理
url:指定要連接的資料庫
driverClassName:指定連接資料庫使用的驅動程序
username:資料庫用戶名
password:資料庫密碼
maxWait:指定最大建立連接等待時間,如果超過此時間將接到異常
maxIdle:指定連接池中連接的最大空閑數
maxActive:指定連接池最大連接數
3、配置web.xml文件。
<web-app>
<resource-ref>
<description>mysql資料庫連接池配置</description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
4、配置context.xml文件
與server.xml文件所在的位置相同。
<Context>
<ResourceLink
name="jdbc/DBPool"
type="javax.sql.DataSource"
global="jdbc/DBPool"
/>
</Context>
5、測試
DataSource pool = null;
Context env = null;
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
env = (Context)new InitialContext().lookup("java:comp/env");
//檢索指定的對象,返回此上下文的一個新實例
pool = (DataSource)env.lookup("jdbc/DBPool");
//獲得資料庫連接池
if(pool==null){out.printl("找不到指定的連接池!");}
con = pool.getConnection();
st = con.createStatement();
rs = st.executeQuery("select * from student");
}catch(Exception ex){out.printl(ne.toString());}