iBatis使用mysql,數據庫超時自動關閉問題的解決
Posted on 2008-05-13 11:08 云自無心水自閑 閱讀(7500) 評論(1) 編輯 收藏 所屬分類: Java 、心得體會 、iBatisiBatis自己帶了一個simple的數據庫連接池,基本的功能都有。但是在處理部分數據庫(比如mysql)的連接空閑時間太長(mysql是8小時)自動超時的時候,就比不上象c3p0這樣的連接池軟件了(c3p0能自動處理數據庫連接被關閉的情況)。
我目前采用的方法是iBatis本身提供的一種算得上是取巧的辦法,基本思想就是每隔一段時間往數據庫發一條查詢語句,這樣使得數據庫空閑時間不會太長,而使得其自動關閉。
方法是在SqlMapConfig.xml的dataSource進行如下配置:
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${jdbc.driverClassName}"/>
<property name="JDBC.ConnectionURL" value="${jdbc.url}"/>
<property name="JDBC.Username" value="${jdbc.username}"/>
<property name="JDBC.Password" value="${jdbc.password}"/>
<property name="Pool.PingEnabled" value="true"/>
<property name="Pool.PingQuery" value="select 1"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="3600000"/>
</dataSource>
開始的3行是關于數據庫連接信息的,不需要說明了。
Pool.PingEnabled:是用于設置開啟是否允許檢測連接狀態
Pool.PingQuery:是用于檢測連接的查詢語名,當然是越簡單越好
Pool.PingConnectionOlderThan:對持續連接時間超過設定值(毫秒)的連接進行檢測,我將其設置為0(不進行此項檢測),否則,iBatis在超過這個時間后,執行每個sql以前檢測連接,對于性能可能會有一定的影響。
Pool.PingConnectionsNotUsedFor:對空閑超過設定值(毫秒)的連接進行檢測,我設置為1小時(mysql缺省的關閉時間是8小時)
當然,還有一個辦法是使用c3p0這樣的連接池
但是需要自己寫一部分代碼,實現以下接口:
我目前采用的方法是iBatis本身提供的一種算得上是取巧的辦法,基本思想就是每隔一段時間往數據庫發一條查詢語句,這樣使得數據庫空閑時間不會太長,而使得其自動關閉。
方法是在SqlMapConfig.xml的dataSource進行如下配置:
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${jdbc.driverClassName}"/>
<property name="JDBC.ConnectionURL" value="${jdbc.url}"/>
<property name="JDBC.Username" value="${jdbc.username}"/>
<property name="JDBC.Password" value="${jdbc.password}"/>
<property name="Pool.PingEnabled" value="true"/>
<property name="Pool.PingQuery" value="select 1"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="3600000"/>
</dataSource>
開始的3行是關于數據庫連接信息的,不需要說明了。
Pool.PingEnabled:是用于設置開啟是否允許檢測連接狀態
Pool.PingQuery:是用于檢測連接的查詢語名,當然是越簡單越好
Pool.PingConnectionOlderThan:對持續連接時間超過設定值(毫秒)的連接進行檢測,我將其設置為0(不進行此項檢測),否則,iBatis在超過這個時間后,執行每個sql以前檢測連接,對于性能可能會有一定的影響。
Pool.PingConnectionsNotUsedFor:對空閑超過設定值(毫秒)的連接進行檢測,我設置為1小時(mysql缺省的關閉時間是8小時)
當然,還有一個辦法是使用c3p0這樣的連接池
但是需要自己寫一部分代碼,實現以下接口:
public interface DataSourceFactory {
public void initialize(Map map);
public DataSource getDataSource();
}