l 使用數據庫連接池優化程序性能
數據庫連接池原理:
一次性創建多個連接,將多個連接緩存在內存中 ,形成數據庫連接池(內存數據庫連接集合),如果應用程序需要操作數據庫,只需要從連接池中獲取一個連接,使用後,關閉連接的同時,將連接放回到連接池中。
DBCP數據源:
需要使用的jar包:
Commons-dbcp.jar:連接池的實現
Commons-pool.jar:連接池實現的依賴庫
需要使用的類:
1:BasicDataSource 直接使用其無參構造器(基本上沒用)
1):void setDriverClassName(“com.mysql.jdbc.Driver”);
2):void setUrl(“jdbc:mysql:///DataBase”);
3):void setUsername(“”);
4):void setPassword(“”);
5)Connection getConnection();
2:BasicDataSourceFactory 直接使用其構造器,配置文件
常見設置:
#連接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=
#<!-- 初始化連接 -->
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
1) DataSource createDataSource(Properties properties)
C3P0數據源:
ComboPooledDataSource類
構造方法:new ComboPooledDataSource()
ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost/database"); cpds.setUser("xxx);
cpds.setPassword("xxx");
Connection conn = cpds.getConnection();
使用配置文件
By default, c3p0 will look for an XML configuration file in its classloader's resource path under the name "/c3p0-config.xml"
模板: <c3p0-config> <default-config> <propertyname="automaticTestTable">con_test</property> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</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> <user-overrides user="test-user"> <property name="maxPoolSize">10</property> <property name="minPoolSize">1</property> <property name="maxStatements">0</property> </user-overrides> </default-config> <!-- This app is massive! --> <named-config name="intergalactoApp"> <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>,可以通過構造器指定要使用哪一個<name-config name=””>中配置的信息
<?xmlversion="1.0"encoding="UTF-8"?> <c3p0-config> <default-config> <propertyname="driverClass">com.mysql.jdbc.Driver</property> <propertyname="jdbcUrl">jdbc:mysql:///mydb</property> <propertyname="user">root</property> <propertyname="password">root</property> </default-config> <name-configname="mysql"> <propertyname="driverClass">com.mysql.jdbc.Driver</property> <propertyname="jdbcUrl">jdbc:mysql:///mydb</property> <propertyname="user">root</property> <propertyname="password">root</property> </name-config> </c3p0-config> |
publicvoid fun2() throws SQLException { //ComboPooledDataSource dataSource = new ComboPooledDataSource(); ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql"); Connection conn = dataSource.getConnection(); Statement ps = conn.createStatement(); ResultSet set = ps.executeQuery("select * from test1"); while(set.next()) { String name = set.getString("name"); System.out.println(name); } set.close(); ps.close(); conn.close(); } |
配置更多信息:
· acquireIncrement 當連接池中沒有連接時,連接池自動獲取連接時,一次獲取的連接個數
· initialPoolSize 連接池初始化時獲取連接的個數
· maxPoolSize 連接池可以保留的最大連接數量
· maxIdleTime 當連接池空閒多就是釋放連接,如果時間值爲0,表示不釋放連接
· minPoolSize 連接池保有的最少連接數量
l JNDI技術簡介
1) JNDI(Java Naming and Directory Interface),Java命名和目錄接口,它對應於J2SE中的javax.naming包
2) 這套API的主要作用在於:它可以把Java對象放在一個容器中(支持JNDI容器 Tomcat),併爲容器中的java對象取一個名稱,以後程序想獲得Java對象,只需通過名稱檢索即可。
3) 其核心API爲Context,它代表JNDI容器,其lookup方法爲檢索容器中對應名稱的對象。
Tomcat數據源
原理:底層是dbcp,基於jndi技術工作
---------------------------------
Jndi:Java命名和目錄接口
本身是一個容器,允許名字和值的方式在其中配置屬性,
操作步驟
1、配置使用tomcat 內置連接池 配置<context> 元素
context元素有三種常見配置位置
1) tomcat/conf/context.xml 所有虛擬主機,所有工程都可以訪問該連接池
2) tomcat/conf/Catalina/localhost/context.xml 當前虛擬主機(localhost)下所有工程都可以使用該連接池
3) 當前工程/META-INF/context.xml(文件名不能變) 只有當前工程可以訪問該連接池
<Context>
<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="root" password="abc"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql:///day14"
maxActive="8" maxIdle="4"/>
</Context>
* 必須先將mysql驅動jar包 複製tomcat/lib下
* 在tomcat啓動服務器時,創建連接池對象,綁定 jdbc/EmployeeDB 指定名稱上
2、通過運行在JNDI容器內部的程序(Servlet/JSP)去訪問tomcat內置連接池
Context context = new InitialContext();
Context envCtx = (Context)context.lookup("java:comp/env"); 固定路徑,JBDI的名字
DataSource datasource = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); 通過綁定名稱,查找指定java對象