c3p0 ConnectionPools設置與使用

c3p0是一個基於JNDI-bindable DataSources(使用DriverManager-based)的很容易使用的JDBC驅動函數庫。

所以在使用c3p0時,還需要一個JDBC的Driver,才能使用,而c3p0的作用只是控制Database的Connection使用,舉個簡單的例子,當Connection被DataBase Server timeout斷線後,c3p0會自動多次去重新連線,避免程式就直接丟出SQLException。

這次剛好遇到Microsoft SQL Server 2005不知為何一直丟出以下訊息,才去找到c3p0來使用的,發生的原因似乎是SQL Server本身對JDBC的Connection TimeOut斷線、或是Connection數不夠。

I/O Error: Connection reset
I/O Error: Software caused connection abort: recv failed

下面是一個範例,結果如下圖:

c3p0.png

原始碼下載

package com.yslifes;
import java.beans.PropertyVetoException;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DB {
private static ComboPooledDataSource  ds = null;
public static DataSource getPool() throws java.sql.SQLException
{
//com.mysql.jdbc.jdbc2.optional. ds = null;
if(ds==null)
{
ds = new ComboPooledDataSource();
try {
ds.setDriverClass( "net.sourceforge.jtds.jdbc.Driver" );
} catch (PropertyVetoException e) {
e.printStackTrace();
throw new java.sql.SQLException(e.getMessage());
} //loads the jdbc driver            
ds.setJdbcUrl( "jdbc:jtds:sqlserver://localhost:1433/master" );
ds.setUser("sa");                                  
ds.setPassword("admin123");
/*ds.setIdleConnectionTestPeriod(30);
ds.setNumHelperThreads(10);
ds.setUnreturnedConnectionTimeout(600);
ds.setMaxIdleTime(30);
*/
}
return ds;
}
public static java.sql.Connection getConnection() throws java.sql.SQLException
{
return getPool().getConnection();
}
public static void main(String args[]) throws SQLException
{
java.sql.Connection con = DB.getConnection();
con.close();
}
}

 

發表迴響