項目中關於數據庫的連接,一般都採用數據源的方式。反正這次是自己實現,沒有其他的要求,就在網上找了一個好點的數據源的實現。看了好幾篇文章,都說 Proxool 比較好,就採用它來實現數據源吧。下面來實現:
1,在項目中的 WEB-INF 目錄下建立 proxool.xml 文件(在其他目錄也行,只要能找到就行),內容爲:
Xml代碼
<?xml version="1.0" encoding="UTF-8"?>
<proxool>
<!-- 數據庫連接別名,通過 proxool.15DayWeb 來獲取此連接 -->
<alias>15DayWeb</alias>
<!-- 數據庫驅動 -->
<driver-url>jdbc:mysql://localhost:3306/15dayweb</driver-url>
<!-- 驅動程序類 -->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<!-- 聯機數據庫的用戶和密碼 -->
<driver-properties>
<property name="user" value="root" />
<property name="password" value="root" />
</driver-properties>
<!-- 最小連接數量,建議設置0以上,保證第一次連接時間 -->
<minimum-connection-count>2</minimum-connection-count>
<!-- 最大連接數量,如果超過最大連接數量則會拋出異常
連接數設置過多,服務器CPU和內存性能消耗很大 -->
<maximum-connection-count>20</maximum-connection-count>
<!-- 某一時間點的最大連接數 -->
<simultaneous-build-throttle>10</simultaneous-build-throttle>
<!-- 一次性產生連接的數量 -->
<prototype-count>2</prototype-count>
<!-- 連接最大時間活動 默認5分鐘 單位:秒 -->
<maximum-active-time>120</maximum-active-time>
<!-- 連接最大生命時間 默認4小時 單位:秒 -->
<maximum-connection-lifetime>600</maximum-connection-lifetime>
</proxool>
<?xml version="1.0" encoding="UTF-8"?>
<proxool>
<!-- 數據庫連接別名,通過 proxool.15DayWeb 來獲取此連接 -->
<alias>15DayWeb</alias>
<!-- 數據庫驅動 -->
<driver-url>jdbc:mysql://localhost:3306/15dayweb</driver-url>
<!-- 驅動程序類 -->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<!-- 聯機數據庫的用戶和密碼 -->
<driver-properties>
<property name="user" value="root" />
<property name="password" value="root" />
</driver-properties>
<!-- 最小連接數量,建議設置0以上,保證第一次連接時間 -->
<minimum-connection-count>2</minimum-connection-count>
<!-- 最大連接數量,如果超過最大連接數量則會拋出異常
連接數設置過多,服務器CPU和內存性能消耗很大 -->
<maximum-connection-count>20</maximum-connection-count>
<!-- 某一時間點的最大連接數 -->
<simultaneous-build-throttle>10</simultaneous-build-throttle>
<!-- 一次性產生連接的數量 -->
<prototype-count>2</prototype-count>
<!-- 連接最大時間活動 默認5分鐘 單位:秒 -->
<maximum-active-time>120</maximum-active-time>
<!-- 連接最大生命時間 默認4小時 單位:秒 -->
<maximum-connection-lifetime>600</maximum-connection-lifetime>
</proxool>
2,在項目中 web.xml 中添加所配置的數據源,在 web-app 下添加如下內容:
Xml代碼
<!-- 配置數據源 -->
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- proxool提供的管理監控工具,可查看當前數據庫連接情況。 -->
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
<!-- 配置數據源 -->
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- proxool提供的管理監控工具,可查看當前數據庫連接情況。 -->
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
對於管理監視工具,如果不使用可以不進行配置。
3,測試:
Java代碼
// 獲取數據庫連接
public void getConnection() throws Exception {
if (conn == null) {
//proxool驅動類
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
// 此處的DBPool是在proxool.xml中配置的連接池別名
conn = DriverManager.getConnection("proxool.15DayWeb");
}
}
// 數據庫訪問,執行查詢操作
public ResultSet query(String sql) throws Exception {
// 初始化數據庫連接
getConnection();
// 創建 Statement 對象
Statement stmt = conn.createStatement();
// 構造 sql 語句
sql = "select * from about_team_table";
return stmt.executeQuery(sql);
}
// 測試是否可以正常讀取表 about_team_table 的數據
public static void main(String[] args) throws Exception {
DbDao dd = new DbDao();
ResultSet rs = dd.query("");
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
System.out.println(rs.getString(3));
System.out.println(rs.getString(4));
System.out.println(rs.getBinaryStream("photo"));
}
}
// 獲取數據庫連接
public void getConnection() throws Exception {
if (conn == null) {
//proxool驅動類
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
// 此處的DBPool是在proxool.xml中配置的連接池別名
conn = DriverManager.getConnection("proxool.15DayWeb");
}
}
// 數據庫訪問,執行查詢操作
public ResultSet query(String sql) throws Exception {
// 初始化數據庫連接
getConnection();
// 創建 Statement 對象
Statement stmt = conn.createStatement();
// 構造 sql 語句
sql = "select * from about_team_table";
return stmt.executeQuery(sql);
}
// 測試是否可以正常讀取表 about_team_table 的數據
public static void main(String[] args) throws Exception {
DbDao dd = new DbDao();
ResultSet rs = dd.query("");
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
System.out.println(rs.getString(3));
System.out.println(rs.getString(4));
System.out.println(rs.getBinaryStream("photo"));
}
}
可以正常使用,測試中不主動關閉連接,在監視工具中當超過活動連接時間自動銷燬,不過在使用中還是要釋放連接的,連接的最大數畢竟是有限的。
tomcat 版本:apache-tomcat-6.0.18
JDK 版本:jdk-6u11-windows-i586-p
NetBeans版本:netbeans-6.5-ml-windows
proxool 版本:proxool-0.9.1