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