SpringJDBC配置C3P0數據庫連接池
今天在Spring的配置文件里面配置C3P0數據源:
先導入c3p0的jar包
<bean id="dataSource" name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 指定連接數據庫的驅動 --> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <!-- 指定連接數據庫的URL --> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/jeanselam" /> <!-- 指定連接數據庫的用戶名 --> <property name="user" value="root" /> <!-- 指定連接數據庫的密碼 --> <property name="password" value="root" /> <!-- 指定連接池中保留的最大連接數. Default:15 --> <property name="maxPoolSize" value="100" /> <!-- 指定連接池中保留的最小連接數 --> <property name="minPoolSize" value="10" /> <!-- 指定連接池的初始化連接數 取值應在minPoolSize 與 maxPoolSize 之間.Default:3 --> <property name="initialPoolSize" value="20" /> <!-- 最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。 Default:0 --> <property name="maxIdleTime" value="600" /> <!-- 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數. Default:3 --> <property name="acquireIncrement" value="5" /> <!-- JDBC的標準,用以控制數據源內加載的PreparedStatements數量。 但由于預緩存的statements屬于單個connection而不是整個連接池所以設置這個參數需要考慮到多方面的因數.如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。Default:0 --> <property name="maxStatements" value="5" /> <!-- 每60秒檢查所有連接池中的空閑連接.Default:0 --> <property name="idleConnectionTestPeriod" value="60" /> </bean> <!-- 通用泛型DAO組件 --> <bean name="abstractDaoImpl" class="com.lin.jllm.dao.impl.AbstractDaoImpl" abstract="true"> <property name="dataSource" ref="dataSource"></property> </bean>
運行測試數據庫的時候報錯:
由于我的OS是linux,所以報錯的原因可能是:
原因分析:
Linux于host相關的幾個文件如下:
/etc/host.conf
功能:指定主機名查找方法,通常指先查找文件/etc/hosts,找不到時再向DNS服務器請求。
對于大多數用戶不用改動此文件內容。
Linux: /etc/host.conf文件內容
order hosts, bind
multi on
/etc/resolv.conf
文件功能:DNS客戶機配置文件,設置DNS服務器的IP地址及DNS域名
相關文件:/etc/host.conf
文件格式:
domainname 域名
search 域名
nameserver Primary_DNS_Server_IP_address
nameserver Second_DNS_Server_IP_address
其中domainname和search可同時存在,也可只有一個;nameserver可指定多個
/etc/hosts
#/etc/hosts
#文件格式: IPaddress hostname aliases
#文件功能: 提供主機名到IP地址的對應關系,建議將自己經常使用的主機
# 加入此文件中,也可將沒有DNS記錄的機器加入到此文件中,
# 這樣會方便網絡應用
127.0.0.1 localhost localhost.localdomain
解決:編輯/etc/hosts文件,在 127.0.0.1 localhost 后加上控制臺里說的所謂的未知的名稱和服務"lin-Dell-System-Inspiron-7420"
運行項目,OK
測試,寫個action:
package com.lin.jllm.action; import java.util.List; import com.lin.jllm.domain.OrderInfo; import com.lin.jllm.service.intf.IOrderInfoService; import com.opensymphony.xwork2.ActionSupport; public class TestAction extends ActionSupport { private static final long serialVersionUID = 1L; private IOrderInfoService orderInfoService; private static volatile int a; private synchronized static void incr() { a++; } public IOrderInfoService getOrderInfoService() { return orderInfoService; } public void setOrderInfoService(IOrderInfoService orderInfoService) { this.orderInfoService = orderInfoService; } @Override public String execute() throws Exception { /** * 并發測試 */ int times = 10000;//設置一萬個并發訪問 long start = System.currentTimeMillis(); for (int i = 0; i < times; i++) { new Thread(new Runnable() { @Override public void run() { try { /** * 讀取記錄 */ List<OrderInfo> orderInfos = orderInfoService.getAll(); for(OrderInfo orderInfo : orderInfos) { System.out.println(orderInfo.toString()); } } catch (Exception e) { // TODO: handle exception } finally { incr();//記錄訪問次數 } } }).start(); } while (true) { if (a == times) { System.out.println("并發量"+times+"\t完成時間:" + (System.currentTimeMillis() - start)+"ms"); break; } Thread.sleep(100); } return SUCCESS; } }
并發量10000 完成時間:6272ms